如何用 Puppeteer 连接到已在运行的浏览器实例
2026/9/9 19:14:47 网站建设 项目流程

如何用 Puppeteer 连接到已在运行的浏览器实例

【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer

当浏览器已经由 Puppeteer 之外的方式启动(手动运行、其他进程或另一个自动化脚本),你不需要再launch一个新浏览器,而是可以用puppeteer.connect()把 Puppeteer 附加到这个已存在的浏览器实例上,对它已有的页面和后续新建的页面执行自动化操作。PuppeteerNode.connect() 的方法签名接受一个ConnectOptions对象,返回Promise<Browser>,即一个可以直接调用newPage()pages()等方法的浏览器实例。

本文的操作路径是:先拿到目标浏览器的 WebSocket 端点地址,再用puppeteer.connect()建立连接,最后验证连接并断开。

如何获取浏览器的 WebSocket 端点

连接的前提是拿到一个 WebSocket 端点 URL。浏览器管理指南 中的说法是:

Usually, you can grab a WebSocket endpoint URL from the browser output.

即通常从浏览器的输出信息中获取。此外,Browser.wsEndpoint() 的文档 给出了另一种获取方式:调试器地址(webSocketDebuggerUrl)可以从http://HOST:PORT/json/version查到,其中HOST:PORT替换为浏览器调试端口实际监机的地址。端点 URL 的固定格式为:

ws://HOST:PORT/devtools/browser/<id>

指南示例中使用的端点形式为ws://127.0.0.1:9222/...(文档示例,实际值以你浏览器输出或/json/version返回的webSocketDebuggerUrl为准)。拿到后填入browserWSEndpoint即可,不需要再启动任何浏览器进程。

使用 connect() 建立连接

在 browser-management.md 给出的主路径代码如下,把端点地址替换为你实际查到的值:

import puppeteer from 'puppeteer'; const browser = await puppeteer.connect({ browserWSEndpoint: 'ws://127.0.0.1:9222/...', // 替换为实际的 webSocketDebuggerUrl }); const page = await browser.newPage(); browser.disconnect();

如果浏览器本来就是外部启动的、你只是需要一个库来连接,也可以安装不下载 Chrome 的 puppeteer-core(npm i puppeteer-core),用法相同,从puppeteer-core导入即可。

ConnectOptions中与连接相关的常用项(详见 ConnectOptions 文档):

属性说明
browserWSEndpointWebSocket 端点地址,本文主路径使用
browserURL可选的浏览器地址字符串
wsOptionsWebSocket 连接选项,仅 Node.js 环境可用;浏览器构建没有 ping frame API,keep-alive 选项会被忽略
protocol连接时默认按运行时判定为'cdp'(Chrome 启动也是'cdp',Firefox 启动为'webDriverBiDi'
defaultViewport设置每个页面的视口,默认{width: 800, height: 600}
headers已废弃,改为通过wsOptions.headers传递;两者同时设置时以wsOptions.headers为准

验证连接是否成功

连接成功后拿到的是完整的Browser对象,可以直接对其做操作。仓库中的 puppeteer-in-browser 示例 展示了典型的验证方式:连接后用browser.pages()列出已有页面并输出数量,然后断开:

const wsUrl = document.querySelector('#ws').value; // 示例中从页面表单读取,实际使用你的端点变量 const browser = await puppeteer.connect({ browserWSEndpoint: wsUrl, }); alert('Browser has ' + (await browser.pages()).length + ' pages'); browser.disconnect();

在 Node.js 脚本中同样的写法是把alert换成console.log(await browser.pages()).length返回页面数,能正常返回并成功执行browser.newPage(),说明连接已建立。

断开连接与关闭浏览器的区别

操作完成后用browser.disconnect()结束连接。Browser.disconnect() 文档 明确说明:它只是把 Puppeteer 从浏览器上断开,浏览器进程会继续运行;指南也强调browser.disconnect()browser.close()不同——它不会关闭浏览器,也不会关闭任何页面。也就是说,断开连接后你之前外部启动的浏览器及其所有页面原样保留,后续仍可再次connect

参考资料

  • 浏览器管理指南:Connecting to a running browser
  • PuppeteerNode.connect()
  • ConnectOptions 选项
  • Browser.wsEndpoint()
  • Browser.disconnect()
  • puppeteer-in-browser 连接示例

【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询