fallback to use js click (#1274)
This commit is contained in:
@@ -1262,18 +1262,34 @@ async def chain_click(
|
|||||||
)
|
)
|
||||||
return action_results
|
return action_results
|
||||||
|
|
||||||
blocking_element = await skyvern_element.find_blocking_element(
|
blocking_element, blocked = await skyvern_element.find_blocking_element(
|
||||||
dom=DomUtil(scraped_page=scraped_page, page=page)
|
dom=DomUtil(scraped_page=scraped_page, page=page)
|
||||||
)
|
)
|
||||||
if blocking_element is None:
|
if blocking_element is None:
|
||||||
|
if not blocked:
|
||||||
|
LOG.info(
|
||||||
|
"Chain click: exit since the element is not blocking by any element",
|
||||||
|
task_id=task.task_id,
|
||||||
|
action=action,
|
||||||
|
element=str(skyvern_element),
|
||||||
|
locator=locator,
|
||||||
|
)
|
||||||
|
return action_results
|
||||||
|
|
||||||
LOG.info(
|
LOG.info(
|
||||||
"Chain click: exit since the element is not blocking by any skyvern element",
|
"Chain click: element is blocked by an non-interactable element, going to use javascript click instead of playwright click",
|
||||||
task_id=task.task_id,
|
task_id=task.task_id,
|
||||||
action=action,
|
action=action,
|
||||||
element=str(skyvern_element),
|
element=str(skyvern_element),
|
||||||
locator=locator,
|
locator=locator,
|
||||||
)
|
)
|
||||||
return action_results
|
try:
|
||||||
|
await skyvern_element.click_in_javascript()
|
||||||
|
action_results.append(ActionSuccess())
|
||||||
|
return action_results
|
||||||
|
except Exception as e:
|
||||||
|
action_results.append(ActionFailure(FailToClick(action.element_id, anchor="self_js", msg=str(e))))
|
||||||
|
return action_results
|
||||||
|
|
||||||
try:
|
try:
|
||||||
LOG.debug(
|
LOG.debug(
|
||||||
|
|||||||
@@ -427,10 +427,10 @@ function getBlockElementUniqueID(element) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!hitElement) {
|
if (!hitElement) {
|
||||||
return "";
|
return ["", false];
|
||||||
}
|
}
|
||||||
|
|
||||||
return hitElement.getAttribute("unique_id") ?? "";
|
return [hitElement.getAttribute("unique_id") ?? "", true];
|
||||||
}
|
}
|
||||||
|
|
||||||
function isHidden(element) {
|
function isHidden(element) {
|
||||||
|
|||||||
@@ -320,12 +320,12 @@ class SkyvernElement:
|
|||||||
assert handler is not None
|
assert handler is not None
|
||||||
return handler
|
return handler
|
||||||
|
|
||||||
async def find_blocking_element(self, dom: DomUtil) -> SkyvernElement | None:
|
async def find_blocking_element(self, dom: DomUtil) -> tuple[SkyvernElement | None, bool]:
|
||||||
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
||||||
blocking_element_id = await skyvern_frame.get_blocking_element_id(await self.get_element_handler())
|
blocking_element_id, blocked = await skyvern_frame.get_blocking_element_id(await self.get_element_handler())
|
||||||
if not blocking_element_id:
|
if not blocking_element_id:
|
||||||
return None
|
return None, blocked
|
||||||
return await dom.get_skyvern_element_by_id(blocking_element_id)
|
return await dom.get_skyvern_element_by_id(blocking_element_id), blocked
|
||||||
|
|
||||||
async def find_element_in_label_children(
|
async def find_element_in_label_children(
|
||||||
self, dom: DomUtil, element_type: InteractiveElement
|
self, dom: DomUtil, element_type: InteractiveElement
|
||||||
@@ -576,6 +576,10 @@ class SkyvernElement:
|
|||||||
|
|
||||||
return dest_x, dest_y
|
return dest_x, dest_y
|
||||||
|
|
||||||
|
async def click_in_javascript(self) -> None:
|
||||||
|
skyvern_frame = await SkyvernFrame.create_instance(self.get_frame())
|
||||||
|
await skyvern_frame.click_element_in_javascript(await self.get_element_handler())
|
||||||
|
|
||||||
async def coordinate_click(
|
async def coordinate_click(
|
||||||
self, page: Page, timeout: float = SettingsManager.get_settings().BROWSER_ACTION_TIMEOUT_MS
|
self, page: Page, timeout: float = SettingsManager.get_settings().BROWSER_ACTION_TIMEOUT_MS
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ class SkyvernFrame:
|
|||||||
js_script = "(element) => checkDisabledFromStyle(element)"
|
js_script = "(element) => checkDisabledFromStyle(element)"
|
||||||
return await self.evaluate(frame=self.frame, expression=js_script, arg=element)
|
return await self.evaluate(frame=self.frame, expression=js_script, arg=element)
|
||||||
|
|
||||||
async def get_blocking_element_id(self, element: ElementHandle) -> str:
|
async def get_blocking_element_id(self, element: ElementHandle) -> tuple[str, bool]:
|
||||||
js_script = "(element) => getBlockElementUniqueID(element)"
|
js_script = "(element) => getBlockElementUniqueID(element)"
|
||||||
return await self.evaluate(frame=self.frame, expression=js_script, arg=element)
|
return await self.evaluate(frame=self.frame, expression=js_script, arg=element)
|
||||||
|
|
||||||
@@ -239,3 +239,7 @@ class SkyvernFrame:
|
|||||||
async def has_ASP_client_control(self) -> bool:
|
async def has_ASP_client_control(self) -> bool:
|
||||||
js_script = "() => hasASPClientControl()"
|
js_script = "() => hasASPClientControl()"
|
||||||
return await self.evaluate(frame=self.frame, expression=js_script)
|
return await self.evaluate(frame=self.frame, expression=js_script)
|
||||||
|
|
||||||
|
async def click_element_in_javascript(self, element: ElementHandle) -> None:
|
||||||
|
js_script = "(element) => element.click()"
|
||||||
|
return await self.evaluate(frame=self.frame, expression=js_script, arg=element)
|
||||||
|
|||||||
Reference in New Issue
Block a user