浏览器(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

相关页面