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

无头模式下Selenium WebDriver无法访问Chrome远程调试端口9223

问题

我正在搭建启用远程调试的无头模式Chrome与Selenium WebDriver环境,使用以下代码启动Chrome并配置WebDriver:

const { Builder, By, until, Capabilities } = require("selenium-webdriver");
const cheerio = require("cheerio");
const ps = require("ps-node");
const { exec, spawn } = require("child_process");
const fs = require("fs");
const net = require("net");
const fetch = require("node-fetch");

 async checkAndKillExistingChrome(port) {
    return new Promise((resolve, reject) => {
      ps.lookup(
        { command: "chrome", arguments: `--remote-debugging-port=${port}` },
        (err, resultList) => {
          if (err) {
            return reject(err);
          }

          const chromeProcess = resultList[0];
          if (chromeProcess) {
            console.log(
              `Killing existing Chrome process with PID: ${chromeProcess.pid}`
            );
            ps.kill(chromeProcess.pid, (err) => {
              if (err) {
                return reject(err);
              }
              console.log("Existing Chrome process terminated.");
              resolve();
            });
          } else {
            resolve();
          }
        }
      );
    });
  }

  async startChrome() {
    return new Promise(async (resolve, reject) => {
      const port = 9223;
      await this.checkAndKillExistingChrome(port);

      console.log(
        "Starting Chrome with remote debugging enabled and in headless mode..."
      );
      exec(
        `"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" --remote-debugging-port=${port} --user-data-dir=C:\\selenium\\ChromeProfile2 --headless --disable-gpu --no-sandbox --enable-logging --v=1 --log-file=C:\\path\\to\\chrome.log`,
        (error, stdout, stderr) => {
          if (error) {
            console.error(`Error starting Chrome: ${error}`);
            reject(error);
            return;
          }
          console.log(`Chrome stdout: ${stdout}`);
          console.error(`Chrome stderr: ${stderr}`);
        }
      );

      setTimeout(async () => {
        try {
          const response = await fetch(`http://127.0.0.1:${port}/json`);
          if (response.ok) {
            const jsonResponse = await response.json();
            if (jsonResponse.length > 0) {
              console.log(`Chrome is running and listening on port ${port}.`);
              resolve();
            } else {
              console.error(
                `Chrome is running on port ${port} but no pages are available.`
              );
              reject(
                new Error(
                  `Chrome is running on port ${port} but no pages are available.`
                )
              );
            }
          } else {
            console.error(`Chrome is not listening on port ${port}.`);
            reject(new Error(`Chrome is not listening on port ${port}.`));
          }
        } catch (err) {
          console.error(
            "Failed to connect to Chrome remote debugging port:",
            err
          );
          reject(err);
        }
      }, 15000); 
    });
  }

  async setupDriver() {
    try {
      console.log("Setting up the driver...");
      const chromeCapabilities = Capabilities.chrome();
      chromeCapabilities.set("goog:chromeOptions", {
        debuggerAddress: "127.0.0.1:9223", // Use 127.0.0.1 explicitly
      });

      this.driver = await new Builder()
        .withCapabilities(chromeCapabilities)
        .build();

      console.log("Driver setup complete.");
    } catch (err) {
      console.error("Error setting up driver:", err);
    }
  }

报错信息:

Error setting up driver: SessionNotCreatedError: session not created: cannot connect to chrome at 127.0.0.1:9223
from unknown error: unable to discover open pages

经netstat确认Chrome实例已在端口9223运行监听,但使用curl访问http://127.0.0.1:9223/json时返回空响应。我已尝试增加超时时间、检查Chrome日志、验证启动命令,但仍无法获取调试信息。请问还有哪些排查步骤可以解决该问题?

排查与解决步骤
  • 强制启动空白页面:在Chrome启动命令中添加--new-window about:blank,无头模式下无初始页面会导致调试接口返回空列表,Selenium无法建立连接。修改后的启动命令:
    "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" --remote-debugging-port=9223 --user-data-dir=C:\\selenium\\ChromeProfile2 --headless --disable-gpu --no-sandbox --enable-logging --v=1 --log-file=C:\\path\\to\\chrome.log --new-window about:blank
    
  • 检查用户数据目录权限:确保C:\\selenium\\ChromeProfile2目录有读写权限,Chrome需要写入配置文件到该目录。若权限不足,可删除该目录后重新启动Chrome,让其自动创建新配置目录。
  • 改用spawn启动Chrome:exec依赖子shell,可能导致进程生命周期或输出捕获异常。改用spawn直接启动更稳定:
    const chromeProcess = spawn('"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"', [
      '--remote-debugging-port=9223',
      '--user-data-dir=C:\\selenium\\ChromeProfile2',
      '--headless',
      '--disable-gpu',
      '--no-sandbox',
      '--enable-logging',
      '--v=1',
      '--log-file=C:\\path\\to\\chrome.log',
      '--new-window about:blank'
    ], { shell: true });
    
    chromeProcess.stdout.on('data', (data) => {
      console.log(`Chrome stdout: ${data}`);
    });
    
    chromeProcess.stderr.on('data', (data) => {
      console.error(`Chrome stderr: ${data}`);
    });
    
    chromeProcess.on('close', (code) => {
      console.log(`Chrome process exited with code ${code}`);
    });
    
  • 验证调试接口基础状态:访问http://127.0.0.1:9223/json/version接口,该接口即使无打开页面也应返回Chrome版本信息。若仍为空,说明调试服务未正常初始化,需重点排查Chrome启动日志中的错误。
  • 匹配ChromeDriver与Chrome版本:确保ChromeDriver版本与本地Chrome完全一致,版本不兼容会直接导致连接失败。可在Chrome的chrome://version页面查看版本,下载对应版本的ChromeDriver。
  • 禁用扩展与插件:启动命令添加--disable-extensions和--disable-plugins,避免第三方扩展干扰调试服务初始化。
  • 检查安全软件拦截:确认本地防火墙或杀毒软件未拦截9223端口的HTTP请求,虽netstat显示端口监听,但安全软件可能过滤调试接口的请求。

内容的提问来源于stack exchange,提问作者user25663514

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:40:23