Default Skyvern 2.0 to google.com if generated website fails to load (#2291)

This commit is contained in:
Shuchang Zheng
2025-05-04 21:36:40 -07:00
committed by GitHub
parent df6252f80a
commit 0540e65d06
3 changed files with 106 additions and 28 deletions

View File

@@ -274,16 +274,6 @@ class BrowserContextFactory:
raise UnknownErrorWhileCreatingBrowserContext(browser_type, e) from e
@classmethod
def set_validate_browser_context(cls, validator: Callable[[Page], Awaitable[bool]]) -> None:
cls._validator = validator
@classmethod
async def validate_browser_context(cls, page: Page) -> bool:
if cls._validator is None:
return True
return await cls._validator(page)
class VideoArtifact(BaseModel):
video_path: str | None = None
@@ -603,6 +593,7 @@ class BrowserState:
loading_time=end_time - start_time,
url=url,
)
# Do we need this?
await asyncio.sleep(5)
LOG.info(f"Successfully went to {url}", url=url, retry_time=retry_time)
return
@@ -639,6 +630,30 @@ class BrowserState:
await self.set_working_page(last_page, len(self.browser_context.pages) - 1)
return last_page
async def validate_browser_context(self, page: Page) -> bool:
# validate the content
try:
skyvern_frame = await SkyvernFrame.create_instance(frame=page)
html = await skyvern_frame.get_content()
except Exception:
LOG.error(
"Error happened while getting the first page content",
exc_info=True,
)
return False
if "Bad gateway error" in html:
LOG.warning("Bad gateway error on the page, recreate a new browser context with another proxy node")
return False
if "client_connect_forbidden_host" in html:
LOG.warning(
"capture the client_connect_forbidden_host error on the page, recreate a new browser context with another proxy node"
)
return False
return True
async def must_get_working_page(self) -> Page:
page = await self.get_working_page()
assert page is not None
@@ -710,7 +725,7 @@ class BrowserState:
)
page = await self.__assert_page()
if not await BrowserContextFactory.validate_browser_context(await self.get_working_page()):
if not await self.validate_browser_context(await self.get_working_page()):
if not await self.close_current_open_page():
LOG.warning("Failed to close the current open page, going to skip the browser context validation")
return page