NodeJS执行Chrome命令无法捕获DevTools WS输出问题求教
解决Node.js执行Chrome命令无法捕获DevTools WS输出的问题
问题说明
在命令行执行以下Chrome启动命令时,能正常看到DevTools的WebSocket地址输出:
google-chrome --remote-debugging-port=9222 --user-data-dir="/home/nishant/Nishant system/nishant/nishant_puppeteer" --profile-directory="puppeteer_chrome"
输出内容:
DevTools listening on ws://[::1]:9222/devtools/
但用Node.js的spawn执行该命令时,无法捕获上述输出,同时需要把输出存入变量,且不关闭浏览器。
问题原因
spawn调用参数结构错误,未正确指定shell命令的执行方式- Chrome的DevTools监听信息默认输出到**标准错误流(stderr)**而非标准输出流(stdout)
- 硬编码WebSocket地址不灵活,应当从捕获的输出中动态提取
修正后的代码
const puppeteer = require('puppeteer'); const { spawn } = require('child_process'); (async () => { // 存储捕获到的输出内容 let devtoolsOutput = ''; // 正确配置spawn调用:用sh -c执行命令,注意路径空格的转义 const child = spawn('/bin/sh', [ '-c', 'google-chrome --remote-debugging-port=9222 --user-data-dir="/home/nishant/Nishant system/nishant/nishant_puppeteer" --profile-directory="puppeteer_chrome"' ]); // 监听stderr流,Chrome的DevTools信息会输出到这里 child.stderr.on('data', (chunk) => { const output = chunk.toString(); devtoolsOutput += output; console.log('捕获到输出:', output); }); // 可选:监听stdout流,捕获其他可能的输出 child.stdout.on('data', (chunk) => { console.log('stdout输出:', chunk.toString()); }); // 等待捕获到WS地址后,再连接Puppeteer await new Promise((resolve) => { const checkInterval = setInterval(() => { if (devtoolsOutput.includes('ws://')) { const wsAddrMatch = devtoolsOutput.match(/ws:\/\/[^\s]+/); if (wsAddrMatch) { clearInterval(checkInterval); resolve(wsAddrMatch[0]); } } }, 100); }).then(async (browserWSEndpoint) => { const browser = await puppeteer.connect({ browserWSEndpoint }); const pages = await browser.pages(); const page = pages[0]; await page.goto('https://www.example.com'); await page.goto('https://partners.myntrainfo.com/'); // 后续业务代码... // 若要保持浏览器不关闭,请勿调用browser.close() }); })();
关键修正点
- 调整
spawn参数结构:第一个参数指定/bin/sh,第二个参数传递-c和完整命令 - 监听
child.stderr而非child.stdout,捕获Chrome输出的DevTools信息 - 添加等待逻辑,动态提取WebSocket地址,避免硬编码
- 将捕获到的输出存入
devtoolsOutput变量,方便后续使用
内容的提问来源于stack exchange,提问作者abcd
相关产品推荐
相关产品推荐

