You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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执行该命令时,无法捕获上述输出,同时需要把输出存入变量,且不关闭浏览器。

问题原因

  1. spawn调用参数结构错误,未正确指定shell命令的执行方式
  2. Chrome的DevTools监听信息默认输出到**标准错误流(stderr)**而非标准输出流(stdout)
  3. 硬编码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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:29:53