add timeout when close browser (#1134)
This commit is contained in:
@@ -14,7 +14,7 @@ from playwright.async_api import BrowserContext, ConsoleMessage, Error, Page, Pl
|
|||||||
from pydantic import BaseModel, PrivateAttr
|
from pydantic import BaseModel, PrivateAttr
|
||||||
|
|
||||||
from skyvern.config import settings
|
from skyvern.config import settings
|
||||||
from skyvern.constants import REPO_ROOT_DIR
|
from skyvern.constants import BROWSER_CLOSE_TIMEOUT, REPO_ROOT_DIR
|
||||||
from skyvern.exceptions import (
|
from skyvern.exceptions import (
|
||||||
FailedToNavigateToUrl,
|
FailedToNavigateToUrl,
|
||||||
FailedToReloadPage,
|
FailedToReloadPage,
|
||||||
@@ -443,17 +443,26 @@ class BrowserState:
|
|||||||
|
|
||||||
async def close(self, close_browser_on_completion: bool = True) -> None:
|
async def close(self, close_browser_on_completion: bool = True) -> None:
|
||||||
LOG.info("Closing browser state")
|
LOG.info("Closing browser state")
|
||||||
if self.browser_context and close_browser_on_completion:
|
try:
|
||||||
LOG.info("Closing browser context and its pages")
|
async with asyncio.timeout(BROWSER_CLOSE_TIMEOUT):
|
||||||
await self.browser_context.close()
|
if self.browser_context and close_browser_on_completion:
|
||||||
LOG.info("Main browser context and all its pages are closed")
|
LOG.info("Closing browser context and its pages")
|
||||||
if self.browser_cleanup is not None:
|
await self.browser_context.close()
|
||||||
self.browser_cleanup()
|
LOG.info("Main browser context and all its pages are closed")
|
||||||
LOG.info("Main browser cleanup is excuted")
|
if self.browser_cleanup is not None:
|
||||||
if self.pw and close_browser_on_completion:
|
self.browser_cleanup()
|
||||||
LOG.info("Stopping playwright")
|
LOG.info("Main browser cleanup is excuted")
|
||||||
await self.pw.stop()
|
except asyncio.TimeoutError:
|
||||||
LOG.info("Playwright is stopped")
|
LOG.error("Timeout to close browser context, going to stop playwright directly")
|
||||||
|
|
||||||
|
try:
|
||||||
|
async with asyncio.timeout(BROWSER_CLOSE_TIMEOUT):
|
||||||
|
if self.pw and close_browser_on_completion:
|
||||||
|
LOG.info("Stopping playwright")
|
||||||
|
await self.pw.stop()
|
||||||
|
LOG.info("Playwright is stopped")
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
LOG.error("Timeout to close playwright, might leave the broswer opening forever")
|
||||||
|
|
||||||
async def take_screenshot(self, full_page: bool = False, file_path: str | None = None) -> bytes:
|
async def take_screenshot(self, full_page: bool = False, file_path: str | None = None) -> bytes:
|
||||||
page = await self.__assert_page()
|
page = await self.__assert_page()
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
from playwright.async_api import async_playwright
|
from playwright.async_api import async_playwright
|
||||||
|
|
||||||
from skyvern.constants import BROWSER_CLOSE_TIMEOUT
|
|
||||||
from skyvern.exceptions import MissingBrowserState
|
from skyvern.exceptions import MissingBrowserState
|
||||||
from skyvern.forge.sdk.schemas.tasks import ProxyLocation, Task
|
from skyvern.forge.sdk.schemas.tasks import ProxyLocation, Task
|
||||||
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRun
|
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRun
|
||||||
@@ -208,18 +206,14 @@ class BrowserManager:
|
|||||||
async def cleanup_for_task(self, task_id: str, close_browser_on_completion: bool = True) -> BrowserState | None:
|
async def cleanup_for_task(self, task_id: str, close_browser_on_completion: bool = True) -> BrowserState | None:
|
||||||
LOG.info("Cleaning up for task")
|
LOG.info("Cleaning up for task")
|
||||||
browser_state_to_close = self.pages.pop(task_id, None)
|
browser_state_to_close = self.pages.pop(task_id, None)
|
||||||
try:
|
if browser_state_to_close:
|
||||||
if browser_state_to_close:
|
# Stop tracing before closing the browser if tracing is enabled
|
||||||
async with asyncio.timeout(BROWSER_CLOSE_TIMEOUT):
|
if browser_state_to_close.browser_context and browser_state_to_close.browser_artifacts.traces_dir:
|
||||||
# Stop tracing before closing the browser if tracing is enabled
|
trace_path = f"{browser_state_to_close.browser_artifacts.traces_dir}/{task_id}.zip"
|
||||||
if browser_state_to_close.browser_context and browser_state_to_close.browser_artifacts.traces_dir:
|
await browser_state_to_close.browser_context.tracing.stop(path=trace_path)
|
||||||
trace_path = f"{browser_state_to_close.browser_artifacts.traces_dir}/{task_id}.zip"
|
LOG.info("Stopped tracing", trace_path=trace_path)
|
||||||
await browser_state_to_close.browser_context.tracing.stop(path=trace_path)
|
await browser_state_to_close.close(close_browser_on_completion=close_browser_on_completion)
|
||||||
LOG.info("Stopped tracing", trace_path=trace_path)
|
LOG.info("Task is cleaned up")
|
||||||
await browser_state_to_close.close(close_browser_on_completion=close_browser_on_completion)
|
|
||||||
LOG.info("Task is cleaned up")
|
|
||||||
except TimeoutError:
|
|
||||||
LOG.warning("Timeout on task cleanup")
|
|
||||||
|
|
||||||
return browser_state_to_close
|
return browser_state_to_close
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user