Skip to content

Commit

Permalink
fix selection issue (#1526)
Browse files Browse the repository at this point in the history
  • Loading branch information
LawyZheng authored Jan 9, 2025
1 parent d1bbaa4 commit 5ca2c45
Showing 1 changed file with 32 additions and 4 deletions.
36 changes: 32 additions & 4 deletions skyvern/webeye/actions/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -984,7 +984,8 @@ async def handle_select_option_action(
element_id=selectable_child.get_id(),
option=action.option,
)
return await handle_select_option_action(select_action, page, scraped_page, task, step)
action = select_action
skyvern_element = selectable_child

# dynamically validate the attr, since it could change into enabled after the previous actions
if await skyvern_element.is_disabled(dynamic=True):
Expand All @@ -997,14 +998,40 @@ async def handle_select_option_action(
)
return [ActionFailure(InteractWithDisabledElement(skyvern_element.get_id()))]

if tag_name == InteractiveElement.SELECT:
if skyvern_element.get_tag_name() == InteractiveElement.SELECT:
LOG.info(
"SelectOptionAction is on <select>",
action=action,
task_id=task.task_id,
step_id=step.step_id,
)
return await normal_select(action=action, skyvern_element=skyvern_element, dom=dom, task=task, step=step)

try:
blocking_element, exist = await skyvern_element.find_blocking_element(dom=dom)
except Exception:
LOG.warning(
"Failed to find the blocking element, continue to select on the orignal <select>",
task_id=task.task_id,
step_id=step.step_id,
exc_info=True,
)
return await normal_select(action=action, skyvern_element=skyvern_element, dom=dom, task=task, step=step)

if not exist or blocking_element is None:
return await normal_select(action=action, skyvern_element=skyvern_element, dom=dom, task=task, step=step)
LOG.info(
"<select> is blocked by another element, going to select on the blocking element",
task_id=task.task_id,
step_id=step.step_id,
blocking_element=blocking_element.get_id(),
)
select_action = SelectOptionAction(
reasoning=action.reasoning,
element_id=blocking_element.get_id(),
option=action.option,
)
action = select_action
skyvern_element = blocking_element

if await skyvern_element.is_checkbox():
LOG.info(
Expand Down Expand Up @@ -1040,6 +1067,7 @@ async def handle_select_option_action(
LOG.info(
"Trigger custom select",
action=action,
element_id=skyvern_element.get_id(),
)

timeout = settings.BROWSER_ACTION_TIMEOUT_MS
Expand Down Expand Up @@ -1089,7 +1117,7 @@ async def handle_select_option_action(
)

if len(incremental_element) == 0:
raise NoIncrementalElementFoundForCustomSelection(element_id=action.element_id)
raise NoIncrementalElementFoundForCustomSelection(element_id=skyvern_element.get_id())

# TODO: support sequetially select from dropdown by value, just support single select now
result, suggested_value = await sequentially_select_from_dropdown(
Expand Down

0 comments on commit 5ca2c45

Please sign in to comment.