• 简体中文
  • 浏览器(CDP)

    当 agent 需要完整的页面自动化能力时,可以把沙箱中的 Chromium 交给 Playwright 或 Puppeteer。daemon 负责返回 CDP 连接地址,客户端连接后即可驱动同一个 Chromium 实例。

    路由:

    • GET /v2/browser/info
    • GET /v1/browser/info

    不用框架的自动化——通过 REST 导航、快照、填写、点击、截图——见 Browser Use

    要求

    GET /v2/sandboxcapabilities 中应包含 browser

    GET /v1/capabilities 的返回结果中应包含 browser

    主机上需要启动 Chromium,并使用 --remote-debugging-port=9222;daemon 必须能够连接到该实例。daemon 只负责作为 CDP 客户端连接 Chromium,不负责启动或代理它。

    获取 CDP URL

    cdp_url 是 Chromium 的 WebSocket 端点,已改写为公开 origin:

    BASE_URL = "http://127.0.0.1:18091"
    sb = Aio(BASE_URL)
    cdp_url = sb.get("/v2/browser/info")["cdp_url"]
    print(cdp_url)
    # -> ws://127.0.0.1:18091/cdp/devtools/browser/9ca46b6e-ab32-46b1-8e7e-7af3d540de4b
    BASE_URL = "http://127.0.0.1:18091"
    sb = Aio(BASE_URL)
    # The 1.x Python SDK's browser.get_info rejects this body; see the migration
    # guide. The route itself answers, so the helper reads it.
    cdp_url = sb.get("/v1/browser/info")["cdp_url"]
    print(cdp_url)
    # -> ws://127.0.0.1:18091/cdp/devtools/browser/9ca46b6e-ab32-46b1-8e7e-7af3d540de4b

    /cdp/ 路径由部署方提供,不是 daemon 提供。详见 CDP 接入

    哪些 SDK 调用会失败,见 1.x SDK 兼容性

    用 Playwright 连接

    cdp_url 传给 connect_over_cdp

    Python
    TypeScript
    import httpx
    from playwright.sync_api import sync_playwright
    
    BASE_URL = "http://127.0.0.1:18091"
    cdp_url = httpx.get(f"{BASE_URL}/v1/browser/info").json()["data"]["cdp_url"]
    
    with sync_playwright() as p:
        browser = p.chromium.connect_over_cdp(cdp_url)
        page = browser.contexts[0].pages[0]
        page.goto("https://example.com")
        print(page.title())
        # → Example Domain

    Playwright 会保留 /cdp/ 前缀和查询参数,因此 cdp_url 可以原样使用。

    请获取现有的 context 和 page,不要重新启动浏览器。浏览器属于沙箱,并与 daemon 自己的 REST 工具共享。

    用 Puppeteer 连接

    browserWSEndpoint。Puppeteer 的 browserURL 会丢掉路径前缀:

    import puppeteer from "puppeteer-core";
    
    const BASE_URL = "http://127.0.0.1:18091";
    
    const info = await fetch(`${BASE_URL}/v1/browser/info`).then((r) => r.json());
    const browser = await puppeteer.connect({ browserWSEndpoint: info.data.cdp_url });
    const [page] = await browser.pages();
    await page.goto("https://example.com");
    console.log(await page.title());
    // → Example Domain

    相关页面