如何在不关闭浏览器的前提下终止Puppeteer的Node.js脚本?
解决方案:终止Node.js脚本但保留Puppeteer浏览器窗口
要实现启动浏览器后终止脚本但不关闭浏览器,并允许后续脚本复用该浏览器实例,核心是先断开脚本与浏览器的连接,再终止Node.js进程,同时保存浏览器的WebSocket端点(WS Endpoint)。
关键操作逻辑
- 调用
browser.disconnect():解除Node.js进程与浏览器的绑定,仅切断两者通信链路,不会关闭浏览器 - 保存
browser.wsEndpoint()到本地文件:为后续脚本提供连接已运行浏览器的入口 - 执行
process.exit(0):优雅终止Node.js脚本,此时因已断开连接,浏览器不会被触发关闭
修改后的完整代码
const puppeteer = require('puppeteer'); const fs = require('fs').promises; (async () => { const browser = await puppeteer.launch({ headless: false, // 可选:配置用户数据目录,保留Cookie和浏览状态 userDataDir: './browser-user-data' }); const page = await browser.newPage(); // 执行你的自动化任务 // await page.goto('https://target-site.com'); // ... 自定义操作逻辑 // 监听输入触发退出 process.stdin.on('data', async (data) => { const input = data.toString().trim(); if (input === 'exit') { // 1. 断开与浏览器的连接 browser.disconnect(); // 2. 保存WS端点到本地文件 const wsEndpoint = browser.wsEndpoint(); await fs.writeFile('./browser-ws-endpoint.txt', wsEndpoint); console.log('浏览器WS端点已保存,脚本将终止,浏览器保持运行'); // 3. 优雅终止Node.js进程 process.exit(0); } }); })();
后续脚本连接已打开的浏览器
创建新脚本,读取保存的WS端点即可直接复用已运行的浏览器实例:
const puppeteer = require('puppeteer'); const fs = require('fs').promises; (async () => { // 读取保存的WS端点 const wsEndpoint = await fs.readFile('./browser-ws-endpoint.txt', 'utf8'); // 连接到已启动的浏览器 const browser = await puppeteer.connect({ browserWSEndpoint: wsEndpoint, defaultViewport: null // 保持原浏览器窗口的视口设置 }); // 复用浏览器执行任务 const pages = await browser.pages(); const targetPage = pages[0]; // 获取第一个标签页 await targetPage.goto('https://another-site.com'); // ... 后续操作 // 注意:仅调用browser.close()才会关闭浏览器,否则浏览器会持续运行 })();
原方法无效的原因说明
- 直接执行
process.exit()时,Puppeteer默认会清理所有关联的浏览器实例,导致浏览器关闭;但先调用browser.disconnect()解绑后,process.exit()不会触发浏览器关闭逻辑 browser.disconnect()仅断开通信,不会终止Node.js脚本,必须配合process.exit()才能结束当前脚本进程
内容的提问来源于stack exchange,提问作者Full cracꝄҼr alcɧҼᵯjst
相关产品推荐
相关产品推荐

