使用puppeteer.connect连接已打开Chrome时报Unexpected server response:404错误
问题原因
报错Unexpected server response: 404有三个核心诱因:
- 你代码中硬编码的
browserWSEndpoint本身格式错误,标准的浏览器调试WebSocket端点的UUID末尾段为12位字符,你填写的ID末尾段只有10位,格式不正确会直接触发404。 - Chrome每次开启远程调试模式时,生成的WebSocket调试端点都是动态变化的,你写死的ID是之前某次启动生成的,当前启动的Chrome对应端点已经变更,请求旧地址自然返回404。
- 启动Chrome时没有关闭所有已运行的Chrome进程,导致
--remote-debugging-port=9222参数没有生效,9222端口根本没有开启远程调试服务。
解决步骤
- 第一步:先关闭所有Chrome后台进程,再使用你提供的命令启动Chrome,确保远程调试端口正常生效。
- 第二步:优先选择动态获取端点的方案,避免每次手动修改代码,参考代码如下:
const puppeteer = require('puppeteer'); const http = require('http'); // 自动拉取当前Chrome的有效ws调试端点 function getValidWsEndpoint() { return new Promise((resolve, reject) => { http.get('http://localhost:9222/json/version', (res) => { let resData = ''; res.on('data', (chunk) => { resData += chunk; }); res.on('end', () => { const debugInfo = JSON.parse(resData); resolve(debugInfo.webSocketDebuggerUrl); }); }).on('error', (err) => { reject(new Error('无法获取调试端点,请确认Chrome已开启远程调试且9222端口未被占用', { cause: err })); }); }); } (async () => { const browserWSEndpoint = await getValidWsEndpoint(); const browser = await puppeteer.connect({ browserWSEndpoint }); const page = await browser.newPage(); // 后续执行你的业务脚本 })().catch(err => { console.error('运行出错:', err); process.exit(1); });
- 如果你需要手动确认端点是否正确,启动Chrome后访问
http://localhost:9222/json/version,复制返回结果中webSocketDebuggerUrl字段的完整值替换代码中的硬编码地址即可。
内容的提问来源于stack exchange,提问作者Puppeteer_Man
相关产品推荐
相关产品推荐

