Puppeteer ConnectOptions 详解:连接已有浏览器实例的完整配置手册
Puppeteer 除了 launch() 启动新浏览器外,还提供 puppeteer.connect() 挂载到已经在运行的浏览器实例,而 ConnectOptions 接口正是控制这次连接的全部配置项——从 WebSocket 端点、传输层、协议选择,到视口、下载行为、超时,再到实验性的 URL 白/黑名单网络护栏。本文以官方 API 文档中的 ConnectOptions 定义为主体,逐参数讲解其类型、默认值与适用限制,并深入 连接入口、CDP 目标管理器 等源码,说明每个配置在底层是如何生效的。
一、ConnectOptions 是什么、在哪里生效
根据 API 文档,ConnectOptions 的定义是:
Generic browser options that can be passed when launching any browser or when connecting to an existing browser instance.
也就是说,它既是 puppeteer.connect() 的参数类型,也是各种 LaunchOptions 的共同基类。函数签名在 puppeteer.connect.md 中给出:
connect: (options: PuppeteerCore.ConnectOptions) =>
Promise<PuppeteerCore.Browser>;
类型定义位于 ConnectOptions.ts,接口内所有公开属性均为 optional。连接流程的入口在 Puppeteer.ts:connect() 会先注入默认的 debug logger,然后委托给内部函数 _connectToBrowser:
// packages/puppeteer-core/src/common/Puppeteer.ts
connect(options: ConnectOptions): Promise<Browser> {
const withLogger = {
logger: debug,
...options,
};
return _connectToBrowser(withLogger);
}
_connectToBrowser(见 BrowserConnector.ts)会先做白/黑名单合法性断言,再根据 options.protocol 分流:
protocol === 'webDriverBiDi'→_connectToBiDiBrowser- 否则 →
_connectToCdpBrowser
二、完整参数速查表
以下表格完整继承自 官方 ConnectOptions 文档,并补充了源码中的类型细节:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
acceptInsecureCerts |
boolean |
false |
导航时是否忽略 HTTPS 证书错误 |
allowlist |
string[] |
— | (实验性)URL 允许清单,标准 URLPattern 语法;需要 Chrome 149+ |
blocklist |
string[] |
— | (实验性)URL 阻止清单,标准 URLPattern 语法 |
browserURL |
string |
— | 浏览器 HTTP 地址,用于自动解析 WebSocket 端点 |
browserWSEndpoint |
string |
— | 浏览器 WebSocket 端点(ws://...) |
capabilities |
SupportedWebDriverCapabilities |
— | 传给 BiDi session.new 的 WebDriver BiDi 能力;仅在 protocol="webDriverBiDi" 且经 Puppeteer.connect() 时生效 |
channel |
ChromeReleaseChannel |
— | (实验性)按通道查找已打开的 Chrome 并连接;仅限 Chrome + Node.js |
defaultViewport |
Viewport | null |
{width: 800, height: 600} |
为每个页面设置视口;传 null 表示使用浏览器默认视口 |
downloadBehavior |
DownloadBehavior |
— | 设置上下文(context)的下载行为 |
handleDevToolsAsPage |
boolean |
false |
是否把 DevTools 窗口当作 Puppeteer 的页面处理;仅支持 CDP 下的 Chrome |
headers |
Record<string, string> |
— | 建立 WebSocket 连接时使用的请求头;仅在 Node.js 环境生效 |
issuesEnabled |
boolean |
true |
(实验性)设为 false 可关闭 issue 事件监听 |
logger |
Logger |
— | (实验性)传入后 Puppeteer 以调试通道前缀调用它;返回的 LoggerFunction 会用于输出该通道的日志 |
networkEnabled |
boolean |
true |
(实验性)设为 false 后不监听网络事件,HTTPRequest/HTTPResponse 等依赖网络事件的功能将不可用 |
protocol |
ProtocolType |
运行时决定 | 启动 Chrome 为 'cdp';启动 Firefox 为 'webDriverBiDi';connect() 时为 'cdp' |
protocolTimeout |
number |
180_000 |
单条协议(CDP)命令的超时(毫秒) |
slowMo |
number |
— | 每次操作额外放慢的毫秒数,用于调试 |
targetFilter |
TargetFilterCallback |
— | 回调,决定 Puppeteer 是否连接某个目标(target) |
transport |
ConnectionTransport |
— | 自定义连接传输层,完全接管底层通信 |
三、四种连接端点:四选一,不可兼得
browserWSEndpoint、browserURL、transport、channel 是 ConnectOptions 中最核心的部分——它们决定了“连到哪里”。在 getConnectionTransport 中有一个硬性断言:
assert(
Number(!!browserWSEndpoint) +
Number(!!browserURL) +
Number(!!transport) +
Number(!!channel) === 1,
'Exactly one of browserWSEndpoint, browserURL, transport or channel must be passed to puppeteer.connect',
);
即必须且只能提供一个。四种方式的取舍:
-
browserWSEndpoint(最常用):直接给出ws://或wss://端点。典型来源是browser.wsEndpoint()或 DevTools 面板打印的 endpoint。 -
browserURL:给出浏览器 HTTP 根地址(如http://127.0.0.1:9222)。源码中会请求browserURL + '/json/version'换取 WebSocket URL 再建连(见 getWSEndpoint),适合远端 Docker 里用端口映射暴露的 DevTools。 -
transport:传入一个实现 ConnectionTransport 接口的自定义对象(需实现send/close),用于自建隧道、代理或复用既有通道等高级场景。此时 endpoint URL 视为空字符串,Puppeteer 不关心网络细节。 -
channel:(实验性)只传一个通道名('chrome' | 'chrome-beta' | 'chrome-canary' | 'chrome-dev'),Puppeteer 自动定位该通道 Chrome 的默认用户数据目录,读取其中的DevToolsActivePort文件,拼出ws://localhost:$ActivePort/devtools/browser去连接。源码实现(BrowserConnector.ts)会:- 调用
@puppeteer/browsers的detectBrowserPlatform与resolveDefaultUserDataDir定位用户数据目录; - 读取
<userDataDir>/DevToolsActivePort,第一行是端口、第二行是路径; - 校验端口合法(
1~65535),组装ws://localhost:${port}${rawPath}后建连; - 失败时抛出
Could not find DevToolsActivePort for ${channel} at ${portPath}。
注意文档标注了限制:仅支持 Chrome,且必须在 Node.js 环境运行。
- 调用
最小示例(对应 连接示例文档 的常规用法):
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser/<id>',
});
四、protocol:同一套选项,两条协议栈
protocol 字段类型为 ProtocolType(即 'cdp' | 'webDriverBiDi'),默认值在 ConnectOptions.ts 的注释中写明:
- 启动 Chrome →
'cdp' - 启动 Firefox →
'webDriverBiDi' - 连接(connect)已有浏览器 →
'cdp'
由于 _connectToBrowser 按该字段分流到 CDP 或 BiDi 两套连接器,因此部分选项只在其中一条协议栈上有效:
capabilities:仅对protocol="webDriverBiDi"且通过Puppeteer.connect()的场景生效,其内容直接传给 BiDi 的session.new命令。类型 SupportedWebDriverCapabilities 在源码中为{firstMatch?, alwaysMatch?},底层排除了unhandledPromptBehavior与acceptInsecureCerts(这两个由 Puppeteer 自己管理,见 ConnectOptions.ts)。handleDevToolsAsPage:文档明确“Supported only in Chrome with CDP”。blocklist/allowlist:只支持 CDP。assertSupportedUrlRestrictions 会在连接前直接抛出blocklist and allowlist are only supported with the CDP protocol。
五、blocklist / allowlist:面向 LLM 场景的网络护栏
这两个实验性属性是 ConnectOptions 中语义最重的配置,官方文档与源码注释(ConnectOptions.ts)给出了完整约定:
- 使用标准 URLPattern 语法匹配 URL,例如阻止
*://example.com/*、阻止所有子域*://*.evil.com/*;允许特定域则写*://example.com/*、*://*.example.com/*。 - 连接已有浏览器时,Puppeteer 会静默 detach 已打开的违规 target;
- 浏览器发起的任何网络请求(导航、图片、脚本等子资源)若命中 blocklist(或不在 allowlist 中),请求将以错误失败;
- 目前仅支持 Chrome;
allowlist额外要求 Chrome 149+(cdp/Browser.ts 中在版本不满足时抛出The allowlist option require Chrome 149 or greater.); - 两者互斥,同时传入会抛
Cannot specify both blocklist and allowlist; - 每条规则都会先经
new URLPattern(rule)校验,非法模式(如'(invalid pattern')在连接阶段即报错,测试用例 专门覆盖了这一点。
底层实现集中在 TargetManager.ts:
isUrlAllowed()对导航做前置检查,命中阻止规则或不在允许清单时返回false,cdp/Frame.ts 中导航会以Navigation to ${url} is blocked by blocklist/allowlist rules报错(测试 验证了page.goto被阻断时捕获到的正是该错误信息);#maybeSetupNetworkConditions()对每个 target 会话下发Network.emulateNetworkConditionsByRule:blocklist 规则映射为offline: true的匹配条件;allowlist 场景则在允许规则之外追加一条urlPattern: ''、offline: true的兜底规则,实现“非白即断网”。
官方文档同时明确了边界:该特性依赖 CDP target 附着期间的网络服务拦截,不是完整网络沙箱(Chrome 仍可能通过其他途径访问网络),其定位是“Puppeteer 控制的 LLM 使用场景下的额外护栏”,完整隔离应使用容器/操作系统级沙箱。示例:
const browser = await puppeteer.connect({
browserWSEndpoint: wsEndpoint,
// 只允许访问目标站点及其子资源
allowlist: ['*://example.com/*', '*://*.example.com/*'],
});
六、页面级默认值:defaultViewport 与 downloadBehavior
defaultViewport:对 connect 到的浏览器中每一个页面生效,默认{width: 800, height: 600};显式传null可让页面使用浏览器自身窗口尺寸,这是连接全屏浏览器做截图或端到端测试时常用的写法。downloadBehavior:类型为 DownloadBehavior,作用于浏览器上下文的下载行为,用于让页面触发的文件下载落到指定目录(可配合Page.setDownloadBehavior语义实现)。handleDevToolsAsPage(默认false):开启后,用户在浏览器里打开的 DevTools 窗口也会以页面形式出现在browser.pages()中,便于自动化场景统一管理所有标签页,仅限 Chrome + CDP。
七、传输与运行时调优选项
-
transport+idGenerator:transport允许替换底层传输;源码中还有一个@internal的idGenerator(ConnectOptions.ts),注释说明它是“CDP/BiDi 消息的自定义 ID 生成器,在同一条 transport 被多个连接共享时很有用”——这是内部机制而非公开配置。 -
headers:Node.js 下会附加到 WebSocket 握手请求上(例如携带认证 Token),浏览器环境不可用。 -
protocolTimeout(默认180_000ms):控制单条 CDP 命令的超时,长任务密集的场景可适当调大,避免protocolTimeout被误触。 -
slowMo:每次操作人为增加等待毫秒数,用于肉眼观察自动化流程,属于调试开关,不应出现在生产配置里。 -
networkEnabled/issuesEnabled:均为默认开启的实验性开关。networkEnabled: false可以显著减少网络事件监听的开销,但 HTTPRequest、HTTPResponse 等一切依赖网络事件的能力随之失效;issuesEnabled同理控制 issue 事件监听。 -
targetFilter:[TargetFilterCallback](https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer/blob/57b44b7d8d596f3b759d9dee56e90dcbf33fc0d6/docs/api/puppeteer.targetfiltercallback.md?utm_source=gitcode_repo_files)回调,逐个 target 决定是否建立连接。连接共享浏览器(例如一个常驻 Chrome 上挂着大量标签页)时,用它只接管自己关心的页面,是控制内存与事件量的重要手段。 -
logger:(实验性)Puppeteer 会以 DebugPrefix 通道前缀调用它,若返回 LoggerFunction 则用于输出该通道的细节日志。源码中的示例:const browser = await puppeteer.connect({ browserWSEndpoint, logger: prefix => { return (...args) => console.log(`[${prefix}]`, ...args); }, }); -
acceptInsecureCerts(默认false):允许页面导航到自签名/过期证书站点,常用于内网测试环境。
八、综合实战示例
把上述选项组合起来,一个贴近真实场景的连接配置如下:
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser/<id>',
// 只接管页面类 target,忽略后台 service worker 等
targetFilter: target => target.type() === 'page',
defaultViewport: null, // 使用浏览器实际窗口大小
protocolTimeout: 300_000, // 长任务场景放宽协议超时
logger: prefix => (...args) => console.debug(`[${prefix}]`, ...args),
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
若目标是把 LLM 驱动的浏览器操作限制在单一站点内,则改用 CDP 协议栈(connect 默认即为 'cdp')并启用白名单:
const browser = await puppeteer.connect({
browserWSEndpoint: wsEndpoint,
allowlist: ['*://docs.example.com/*'],
});
连接失败时的排查顺序建议:
- 是否恰好只提供了四种端点之一(源码断言会直接提示);
channel模式下 Chrome 是否以默认用户数据目录启动、DevToolsActivePort文件是否存在且端口有效;- 使用了
allowlist但 Chrome 版本低于 149; - 同时传了
blocklist与allowlist,或搭配了protocol: 'webDriverBiDi'。
小结
ConnectOptions 是 Puppeteer “附着已有浏览器”这条路径的完整配置面:四种互斥端点(browserWSEndpoint / browserURL / transport / channel)解决“连哪里”,protocol 决定走 CDP 还是 WebDriver BiDi,defaultViewport、downloadBehavior、targetFilter、protocolTimeout 等决定“连上之后如何表现”,而实验性的 blocklist/allowlist 则把 URL 级网络护栏(基于 URLPattern 与 Network.emulateNetworkConditionsByRule)内建进了连接层,服务于 LLM 自动化场景的安全约束。所有参数的定义见 ConnectOptions.ts,连接逻辑见 BrowserConnector.ts,网络限制的完整行为验证可参考 network_restrictions.test.ts。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00