All checks were successful
技能自动化发布 / release (push) Successful in 5s
Co-authored-by: Cursor <cursoragent@cursor.com>
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
"""统一 persistent context 启动封装(仅浏览器自动化,不负责录屏)。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import os
|
||
from typing import TYPE_CHECKING
|
||
|
||
from ..runtime_env import find_chrome_executable
|
||
from .stealth import (
|
||
STEALTH_INIT_SCRIPT,
|
||
persistent_context_launch_parts,
|
||
stealth_enabled,
|
||
)
|
||
|
||
if TYPE_CHECKING:
|
||
from playwright.async_api import BrowserContext
|
||
|
||
|
||
async def launch_persistent_browser(
|
||
playwright,
|
||
*,
|
||
profile_dir: str,
|
||
channel: str = "chrome",
|
||
executable_path: str | None = None,
|
||
headless: bool | None = None,
|
||
extra_args: list[str] | None = None,
|
||
) -> "BrowserContext":
|
||
"""用 stealth 参数启动 persistent context + 注入 STEALTH_INIT_SCRIPT。
|
||
|
||
headless=None 时读 OPENCLAW_BROWSER_HEADLESS。
|
||
录屏由 RpaVideoSession(ffmpeg)负责,本函数不向 Playwright 传递任何录屏参数。
|
||
"""
|
||
if headless is None:
|
||
v = (os.environ.get("OPENCLAW_BROWSER_HEADLESS") or "0").strip().lower()
|
||
headless = v in ("1", "true", "yes", "on")
|
||
|
||
chrome = executable_path or find_chrome_executable()
|
||
if not chrome:
|
||
raise RuntimeError(
|
||
"ERROR:MISSING_BROWSER 未检测到 Chrome 或 Edge 浏览器,请安装后重试。"
|
||
)
|
||
|
||
args, ignore = persistent_context_launch_parts(extra_args=extra_args)
|
||
launch_kwargs: dict = dict(
|
||
user_data_dir=profile_dir,
|
||
headless=headless,
|
||
executable_path=chrome,
|
||
locale="zh-CN",
|
||
no_viewport=True,
|
||
args=args,
|
||
)
|
||
if ignore is not None:
|
||
launch_kwargs["ignore_default_args"] = ignore
|
||
|
||
context = await playwright.chromium.launch_persistent_context(**launch_kwargs)
|
||
if stealth_enabled():
|
||
await context.add_init_script(STEALTH_INIT_SCRIPT)
|
||
return context
|