diff --git a/skyvern/config.py b/skyvern/config.py index 6f4ce389..db1079d6 100644 --- a/skyvern/config.py +++ b/skyvern/config.py @@ -75,6 +75,10 @@ class Settings(BaseSettings): BROWSER_WIDTH: int = 1920 BROWSER_HEIGHT: int = 1080 + # Add extension folders name here to load extension in your browser + EXTENSIONS_BASE_PATH: str = "./extensions" + EXTENSIONS: list[str] = [] + # Workflow constant parameters WORKFLOW_DOWNLOAD_DIRECTORY_PARAMETER_KEY: str = "SKYVERN_DOWNLOAD_DIRECTORY" WORKFLOW_WAIT_BLOCK_MAX_SEC: int = 30 * 60 diff --git a/skyvern/webeye/browser_factory.py b/skyvern/webeye/browser_factory.py index ec4174b3..0131dbd9 100644 --- a/skyvern/webeye/browser_factory.py +++ b/skyvern/webeye/browser_factory.py @@ -170,6 +170,16 @@ class BrowserContextFactory: f"{settings.HAR_PATH}/{datetime.utcnow().strftime('%Y-%m-%d')}/{BrowserContextFactory.get_subdir()}.har" ) + extension_paths = [] + if settings.EXTENSIONS and settings.EXTENSIONS_BASE_PATH: + try: + os.makedirs(settings.EXTENSIONS_BASE_PATH, exist_ok=True) + + extension_paths = [str(Path(settings.EXTENSIONS_BASE_PATH) / ext) for ext in settings.EXTENSIONS] + LOG.info("Extensions paths constructed", extension_paths=extension_paths) + except Exception as e: + LOG.error("Error constructing extension paths", error=str(e)) + browser_args = [ "--disable-blink-features=AutomationControlled", "--disk-cache-size=1", @@ -180,6 +190,11 @@ class BrowserContextFactory: if cdp_port: browser_args.append(f"--remote-debugging-port={cdp_port}") + if extension_paths: + joined_paths = ",".join(extension_paths) + browser_args.extend([f"--disable-extensions-except={joined_paths}", f"--load-extension={joined_paths}"]) + LOG.info("Extensions added to browser args", extensions=joined_paths) + args = { "locale": settings.BROWSER_LOCALE, "color_scheme": "no-preference",