vscode调试puppeteer脚本的关键是确保浏览器实例暴露cdp调试通道:必须用pwa-chrome类型配置launch.json,request设为attach,url填http://localhost:9222,puppeteer.launch需显式传--remote-debugging-port=9222参数,禁用devtools:true,推荐puppeteer-core复用本地chrome并连接完整websocket地址。

VSCode 调试 Puppeteer 脚本,关键不在“怎么配”,而在于浏览器实例是否真正暴露了调试通道——9222 端口没通、puppeteer.launch 没带 --remote-debugging-port、或用了 puppeteer-core 却没连上 WebSocket,断点就永远不生效。
launch.json 里必须用 pwa-chrome 类型,不能选 node
很多人直接复用 Node.js 的调试配置,结果脚本跑起来了,但 VSCode 根本收不到页面上下文,断点灰掉、console.log 不输出、page.evaluate 里的代码无法单步。这是因为 Puppeteer 是控制远端浏览器的,VSCode 必须通过 Chrome DevTools Protocol(CDP)连接 Chromium 实例,不是跑 JS 引擎本身。
-
type字段必须是"pwa-chrome",不是"node"或"pwa-node" -
request必须是"attach"(连接已启动的浏览器),不是"launch"(VSCode 自己拉起浏览器) -
url填"http://localhost:9222",不是你的目标网页地址 -
webRoot设为"${workspaceFolder}",否则 source map 无法映射到源码行
puppeteer.launch 必须显式传 --remote-debugging-port=9222
默认 puppeteer.launch({ headless: false }) 启动的 Chromium 是不开放调试端口的。VSCode 连不上,就等于没调试入口。你不能依赖 devtools: true ——它只弹窗 DevTools,不暴露 CDP 接口给外部工具。
- 正确写法:
await puppeteer.launch({ headless: false, args: ['--remote-debugging-port=9222'] }) - 错误写法:
await puppeteer.launch({ headless: false, devtools: true })(VSCode 无法 attach) - 如果端口被占,改用其他端口(如
9223),但launch.json和args必须同步改 - Windows 下注意路径空格:
args里不要写成'--remote-debugging-port = 9222'(等号前后有空格会失败)
用 puppeteer-core 复用本地 Chrome 更稳定
每次 puppeteer.launch 都会下载独立 Chromium,版本、缓存、扩展全隔离,调试时容易丢失上下文(比如 localStorage、cookie、甚至 DevTools 断点状态)。换成系统已安装的 Chrome,配合手动启动 + puppeteer-core.connect(),能避免大量“断点突然失效”问题。
- 终端手动启 Chrome:
google-chrome --remote-debugging-port=9222 --no-first-run --no-default-browser-check(macOS/Linux) - 代码中改用
const puppeteer = require('puppeteer-core') - 连接时用完整 WebSocket 地址:
puppeteer.connect({ browserWSEndpoint: 'ws://localhost:9222/devtools/browser/xxx-uuid' }) -
browserWSEndpoint从chrome://version页面底部的 “远程调试地址” 复制,别手敲
断点不命中?先检查右下角状态栏和 Chrome 的 chrome://inspect
VSCode 调试失败,90% 是因为底层连接根本没建起来。别急着改代码逻辑,先确认基础设施通不通。
- VSCode 右下角状态栏应显示
Chrome (9222),不是灰色或报错 - 浏览器打开
chrome://inspect,看 “Remote Target” 下有没有你的页面,且状态是Inspectable - 如果
chrome://inspect里没有目标,说明puppeteer.launch没成功带参启动,或端口被防火墙拦截 - 如果 VSCode 显示已连接但断点不亮,检查
launch.json里sourceMaps是否设为true,且项目有生成.map文件(TypeScript 项目尤其要注意)
最易忽略的一点:Puppeteer 脚本里所有异步操作(page.goto、page.click)都必须在 await 后设断点——没 await 就等于没等页面加载完,断点会直接跳过。调试爬虫,本质是调试「时机」,不是调试「语法」。











