refactor chain click (#1186)
This commit is contained in:
@@ -127,6 +127,9 @@ class SkyvernElement:
|
||||
self.locator = locator
|
||||
self.hash_value = hash_value
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"SkyvernElement({str(self.__static_element)})"
|
||||
|
||||
def build_HTML(self, need_trim_element: bool = True, need_skyvern_attrs: bool = True) -> str:
|
||||
element_dict = self.get_element_dict()
|
||||
if need_trim_element:
|
||||
@@ -263,6 +266,22 @@ class SkyvernElement:
|
||||
async def is_selectable(self) -> bool:
|
||||
return self.get_selectable() or self.get_tag_name() in SELECTABLE_ELEMENT
|
||||
|
||||
async def is_visible(self) -> bool:
|
||||
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
||||
return await skyvern_frame.get_element_visible(await self.get_element_handler())
|
||||
|
||||
async def is_parent_of(self, target: ElementHandle) -> bool:
|
||||
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
||||
return await skyvern_frame.is_parent(await self.get_element_handler(), target)
|
||||
|
||||
async def is_child_of(self, target: ElementHandle) -> bool:
|
||||
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
||||
return await skyvern_frame.is_parent(target, await self.get_element_handler())
|
||||
|
||||
async def is_sibling_of(self, target: ElementHandle) -> bool:
|
||||
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
||||
return await skyvern_frame.is_sibling(await self.get_element_handler(), target)
|
||||
|
||||
def get_element_dict(self) -> dict:
|
||||
return self.__static_element
|
||||
|
||||
@@ -301,6 +320,13 @@ class SkyvernElement:
|
||||
assert handler is not None
|
||||
return handler
|
||||
|
||||
async def find_blocking_element(self, dom: DomUtil) -> SkyvernElement | None:
|
||||
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
||||
blocking_element_id = await skyvern_frame.get_blocking_element_id(await self.get_element_handler())
|
||||
if not blocking_element_id:
|
||||
return None
|
||||
return await dom.get_skyvern_element_by_id(blocking_element_id)
|
||||
|
||||
def find_element_id_in_label_children(self, element_type: InteractiveElement) -> str | None:
|
||||
tag_name = self.get_tag_name()
|
||||
if tag_name != "label":
|
||||
@@ -354,6 +380,23 @@ class SkyvernElement:
|
||||
|
||||
return await dom.get_skyvern_element_by_id(unique_id)
|
||||
|
||||
async def find_bound_label_by_attr_id(
|
||||
self, timeout: float = SettingsManager.get_settings().BROWSER_ACTION_TIMEOUT_MS
|
||||
) -> Locator | None:
|
||||
if self.get_tag_name() == "label":
|
||||
return None
|
||||
|
||||
element_id: str = await self.get_attr("id", timeout=timeout)
|
||||
if not element_id:
|
||||
return None
|
||||
|
||||
locator = self.get_frame().locator(f"label[for='{element_id}']")
|
||||
cnt = await locator.count()
|
||||
if cnt == 1:
|
||||
return locator
|
||||
|
||||
return None
|
||||
|
||||
async def find_selectable_child(self, dom: DomUtil) -> SkyvernElement | None:
|
||||
# BFS to find the first selectable child
|
||||
index = 0
|
||||
|
||||
@@ -182,6 +182,10 @@ class SkyvernFrame:
|
||||
js_script = "(element) => checkDisabledFromStyle(element)"
|
||||
return await self.evaluate(frame=self.frame, expression=js_script, arg=element)
|
||||
|
||||
async def get_blocking_element_id(self, element: ElementHandle) -> str:
|
||||
js_script = "(element) => getBlockElementUniqueID(element)"
|
||||
return await self.evaluate(frame=self.frame, expression=js_script, arg=element)
|
||||
|
||||
async def scroll_to_top(self, draw_boxes: bool) -> float:
|
||||
"""
|
||||
Scroll to the top of the page and take a screenshot.
|
||||
@@ -224,6 +228,14 @@ class SkyvernFrame:
|
||||
js_script = "() => isWindowScrollable()"
|
||||
return await self.evaluate(frame=self.frame, expression=js_script)
|
||||
|
||||
async def is_parent(self, parent: ElementHandle, child: ElementHandle) -> bool:
|
||||
js_script = "([parent, child]) => isParent(parent, child)"
|
||||
return await self.evaluate(frame=self.frame, expression=js_script, arg=[parent, child])
|
||||
|
||||
async def is_sibling(self, el1: ElementHandle, el2: ElementHandle) -> bool:
|
||||
js_script = "([el1, el2]) => isSibling(el1, el2)"
|
||||
return await self.evaluate(frame=self.frame, expression=js_script, arg=[el1, el2])
|
||||
|
||||
async def has_ASP_client_control(self) -> bool:
|
||||
js_script = "() => hasASPClientControl()"
|
||||
return await self.evaluate(frame=self.frame, expression=js_script)
|
||||
|
||||
Reference in New Issue
Block a user