如何用 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 文档):
| 属性 | 说明 |
|---|---|
browserWSEndpoint | WebSocket 端点地址,本文主路径使用 |
browserURL | 可选的浏览器地址字符串 |
wsOptions | WebSocket 连接选项,仅 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),仅供参考