From f0b0a22d2563007f5bb3e17dc92b185132f50712 Mon Sep 17 00:00:00 2001 From: Shuchang Zheng Date: Thu, 29 May 2025 20:41:36 -0700 Subject: [PATCH] refresh options before doing select (#2537) --- skyvern/webeye/actions/handler.py | 1 + skyvern/webeye/utils/dom.py | 12 ++++++++++++ skyvern/webeye/utils/page.py | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/skyvern/webeye/actions/handler.py b/skyvern/webeye/actions/handler.py index 6f3adafb..300016b9 100644 --- a/skyvern/webeye/actions/handler.py +++ b/skyvern/webeye/actions/handler.py @@ -3193,6 +3193,7 @@ async def normal_select( step_id=step.step_id, ) + await skyvern_element.refresh_select_options() options_html = skyvern_element.build_HTML() field_information = ( input_or_select_context.field if not input_or_select_context.intention else input_or_select_context.intention diff --git a/skyvern/webeye/utils/dom.py b/skyvern/webeye/utils/dom.py index 93693942..c9615b50 100644 --- a/skyvern/webeye/utils/dom.py +++ b/skyvern/webeye/utils/dom.py @@ -795,6 +795,18 @@ class SkyvernElement: LOG.warning("Failed to navigate to the href link", exc_info=True, href=href, current_url=page.url) raise + async def refresh_select_options(self) -> tuple[list, str] | None: + if self.get_tag_name() != InteractiveElement.SELECT: + return None + + frame = await SkyvernFrame.create_instance(self.get_frame()) + options, selected_value = await frame.get_select_options(await self.get_element_handler()) + self.__static_element["options"] = options + if "attributes" in self.__static_element: + self.__static_element["attributes"]["selected"] = selected_value + self._attributes = self.__static_element["attributes"] + return options, selected_value + class DomUtil: """ diff --git a/skyvern/webeye/utils/page.py b/skyvern/webeye/utils/page.py index 71a8e845..ab70d6db 100644 --- a/skyvern/webeye/utils/page.py +++ b/skyvern/webeye/utils/page.py @@ -291,3 +291,7 @@ class SkyvernFrame: async def remove_target_attr(self, element: ElementHandle) -> None: js_script = "(element) => element.removeAttribute('target')" return await self.evaluate(frame=self.frame, expression=js_script, arg=element) + + async def get_select_options(self, element: ElementHandle) -> tuple[list, str]: + js_script = "([element]) => getSelectOptions(element)" + return await self.evaluate(frame=self.frame, expression=js_script, arg=[element])