From 912d8dfa15b59b12554ed82a7cd0eea2381b9c3c Mon Sep 17 00:00:00 2001 From: pedrohsdb Date: Tue, 27 Jan 2026 17:25:24 -0800 Subject: [PATCH] Fix AttributeError in _wait_for_page_ready_before_action (#4563) --- .../script_generations/script_skyvern_page.py | 5 ++-- skyvern/forge/agent.py | 17 ++++++++++- skyvern/webeye/utils/page.py | 28 +++++++++++++++++-- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/skyvern/core/script_generations/script_skyvern_page.py b/skyvern/core/script_generations/script_skyvern_page.py index 5dd3e8f2..ba2da0e6 100644 --- a/skyvern/core/script_generations/script_skyvern_page.py +++ b/skyvern/core/script_generations/script_skyvern_page.py @@ -546,10 +546,11 @@ class ScriptSkyvernPage(SkyvernPage): 3. DOM stability (no significant mutations for 300ms) """ try: - if not self._page: + # Note: SkyvernPage uses self.page, not self._page + if not self.page: return - skyvern_frame = await SkyvernFrame.create_instance(frame=self._page) + skyvern_frame = await SkyvernFrame.create_instance(frame=self.page) await skyvern_frame.wait_for_page_ready( network_idle_timeout_ms=settings.PAGE_READY_NETWORK_IDLE_TIMEOUT_MS, loading_indicator_timeout_ms=settings.PAGE_READY_LOADING_INDICATOR_TIMEOUT_MS, diff --git a/skyvern/forge/agent.py b/skyvern/forge/agent.py index cdbcc1c0..6e189c53 100644 --- a/skyvern/forge/agent.py +++ b/skyvern/forge/agent.py @@ -2456,8 +2456,23 @@ class ForgeAgent: break except (FailedToTakeScreenshot, ScrapingFailed) as e: if idx < len(SCRAPE_TYPE_ORDER) - 1: + LOG.warning( + "Scrape attempt failed, will retry with next strategy", + attempt=idx + 1, + scrape_type=scrape_type.value if hasattr(scrape_type, "value") else str(scrape_type), + error_type=e.__class__.__name__, + url=task.url, + ) continue - LOG.exception(f"{e.__class__.__name__} happened in two normal attempts and reload-page retry") + LOG.error( + "All scrape attempts failed", + total_attempts=len(SCRAPE_TYPE_ORDER), + error_type=e.__class__.__name__, + url=task.url, + step_order=step.order, + step_retry=step.retry_index, + exc_info=True, + ) raise e if scraped_page is None: diff --git a/skyvern/webeye/utils/page.py b/skyvern/webeye/utils/page.py index 34b07f6c..5c04c861 100644 --- a/skyvern/webeye/utils/page.py +++ b/skyvern/webeye/utils/page.py @@ -74,6 +74,15 @@ async def _current_viewpoint_screenshot_helper( ) -> bytes: if page.is_closed(): raise FailedToTakeScreenshot(error_message="Page is closed") + + # Capture page context for debugging screenshot issues + url = page.url + try: + viewport = page.viewport_size + viewport_info = f"{viewport['width']}x{viewport['height']}" if viewport else "unknown" + except Exception: + viewport_info = "unknown" + try: if mode == ScreenshotMode.DETAILED: await page.wait_for_load_state(timeout=SettingsManager.get_settings().BROWSER_LOADING_TIMEOUT_MS) @@ -94,10 +103,25 @@ async def _current_viewpoint_screenshot_helper( ) return screenshot except TimeoutError as e: - LOG.exception(f"Timeout error while taking screenshot: {str(e)}") + LOG.error( + "Screenshot timeout", + timeout_ms=timeout, + url=url, + viewport=viewport_info, + full_page=full_page, + mode=mode.value if hasattr(mode, "value") else str(mode), + error=str(e), + ) raise FailedToTakeScreenshot(error_message=str(e)) from e except Exception as e: - LOG.exception(f"Unknown error while taking screenshot: {str(e)}") + LOG.error( + "Screenshot failed", + url=url, + viewport=viewport_info, + full_page=full_page, + error=str(e), + exc_info=True, + ) raise FailedToTakeScreenshot(error_message=str(e)) from e