无头模式下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
相关产品推荐
相关产品推荐

