diff --git a/skyvern/forge/agent.py b/skyvern/forge/agent.py index 5018dbdeb..6bf19314f 100644 --- a/skyvern/forge/agent.py +++ b/skyvern/forge/agent.py @@ -604,6 +604,7 @@ async def _build_and_record_step_prompt( for window_step in window_steps: if window_step.output and window_step.output.action_results: action_results.extend(window_step.output.action_results) + action_results_str = json.dumps([action_result.model_dump() for action_result in action_results]) # Generate the extract action prompt navigation_goal = task.navigation_goal diff --git a/skyvern/forge/sdk/workflow/models/block.py b/skyvern/forge/sdk/workflow/models/block.py index e841545d5..e17e69507 100644 --- a/skyvern/forge/sdk/workflow/models/block.py +++ b/skyvern/forge/sdk/workflow/models/block.py @@ -227,7 +227,7 @@ async def execute(self, workflow_run_id: str, **kwargs: dict) -> BlockResult: raise TaskNotFound(task.task_id) if not updated_task.status.is_final(): raise UnexpectedTaskStatus(task_id=updated_task.task_id, status=updated_task.status) - if updated_task.status == TaskStatus.completed: + if updated_task.status == TaskStatus.completed or updated_task.status == TaskStatus.terminated: LOG.info( f"Task completed", task_id=updated_task.task_id, diff --git a/skyvern/webeye/actions/handler.py b/skyvern/webeye/actions/handler.py index 7c7fe80d3..c4ccacdb9 100644 --- a/skyvern/webeye/actions/handler.py +++ b/skyvern/webeye/actions/handler.py @@ -143,6 +143,11 @@ async def handle_input_text_action( ) -> list[ActionResult]: xpath = await validate_actions_in_dom(action, page, scraped_page) locator = page.locator(f"xpath={xpath}") + + current_text = await locator.input_value() + if current_text == action.text: + return [ActionSuccess()] + await locator.clear() text = get_actual_value_of_parameter_if_secret(task, action.text) await locator.fill(text, timeout=SettingsManager.get_settings().BROWSER_ACTION_TIMEOUT_MS) @@ -313,6 +318,9 @@ async def handle_select_option_action( ) return [ActionFailure(Exception(f"Cannot handle SelectOptionAction on a non-listbox element"))] + current_text = await locator.input_value() + if current_text == action.option.label: + return ActionSuccess() try: # First click by label (if it matches) await page.click(f"xpath={xpath}", timeout=SettingsManager.get_settings().BROWSER_ACTION_TIMEOUT_MS) diff --git a/skyvern/webeye/scraper/domUtils.js b/skyvern/webeye/scraper/domUtils.js index 6dfcaa3cc..1f5959403 100644 --- a/skyvern/webeye/scraper/domUtils.js +++ b/skyvern/webeye/scraper/domUtils.js @@ -505,6 +505,9 @@ function buildTreeFromBody() { const selectContainers = document.querySelectorAll(".select2-container"); selectContainers.forEach((element) => { + // hide the select2 container + element.style.display = "none"; + // search select in previous let _pre = element.previousElementSibling; while (_pre) { @@ -513,8 +516,6 @@ function buildTreeFromBody() { _pre.style.display === "none" ) { _pre.style.removeProperty("display"); - // only hide the select2 container when an alternative select found - element.style.display = "none"; return; } _pre = _pre.previousElementSibling; @@ -528,8 +529,6 @@ function buildTreeFromBody() { _next.style.display === "none" ) { _next.style.removeProperty("display"); - // only hide the select2 container when an alternative select found - element.style.display = "none"; return; } _next = _next.nextElementSibling;