From 67bee9a4872c8d882344ee4ea20bde4eb5e23570 Mon Sep 17 00:00:00 2001 From: LawyZheng Date: Tue, 22 Oct 2024 02:21:05 +0800 Subject: [PATCH] fix chain click bug (#1019) --- skyvern/exceptions.py | 4 ++-- skyvern/webeye/actions/handler.py | 28 ++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/skyvern/exceptions.py b/skyvern/exceptions.py index a389a114..d0c580ef 100644 --- a/skyvern/exceptions.py +++ b/skyvern/exceptions.py @@ -355,8 +355,8 @@ class InputActionOnSelect2Dropdown(SkyvernException): class FailToClick(SkyvernException): - def __init__(self, element_id: str): - super().__init__(f"Failed to click. element_id={element_id}") + def __init__(self, element_id: str, anchor: str = "self"): + super().__init__(f"Failed to click({anchor}). element_id={element_id}") class FailToSelectByLabel(SkyvernException): diff --git a/skyvern/webeye/actions/handler.py b/skyvern/webeye/actions/handler.py index 54c7584a..1f1d8d1b 100644 --- a/skyvern/webeye/actions/handler.py +++ b/skyvern/webeye/actions/handler.py @@ -1060,9 +1060,33 @@ async def chain_click( javascript_triggered=javascript_triggered, ) ] - if await is_input_element(locator): + + if skyvern_element.get_tag_name() == "label": + LOG.info( + "Chain click: it's a label element. going to try for-click", + task_id=task.task_id, + action=action, + locator=locator, + ) + try: + if bound_element := await skyvern_element.find_label_for( + dom=DomUtil(scraped_page=scraped_page, page=page) + ): + await bound_element.get_locator().click(timeout=timeout) + action_results.append(ActionSuccess()) + return action_results + except Exception: + action_results.append( + ActionFailure( + FailToClick(action.element_id, anchor="for"), + javascript_triggered=javascript_triggered, + ) + ) + + if skyvern_element.get_tag_name() == InteractiveElement.INPUT: LOG.info( "Chain click: it's an input element. going to try sibling click", + task_id=task.task_id, action=action, locator=locator, ) @@ -1100,7 +1124,7 @@ async def chain_click( ) action_results.append( ActionFailure( - FailToClick(action.element_id), + FailToClick(action.element_id, anchor="parent"), javascript_triggered=javascript_triggered, interacted_with_parent=True, )