断点不生效是因为vscode调试配置与puppeteer运行模式不匹配:必须用pwa-chrome类型+attach模式连接--remote-debugging-port=9222暴露的cdp端口,而非node类型;devtools: true不开放外部调试,需显式添加远程调试参数;推荐puppeteer-core+手动启动chrome并实时获取websocketdebuggerurl确保会话持久。

断点不生效,基本就是调试配置没对上 Puppeteer 的运行模式。 Puppeteer 默认启动的是无头 Chromium 实例,而 VSCode 的 pwa-chrome 配置默认期望连接的是「已打开的、带 UI 的浏览器」——它根本收不到 CDP 会话,自然没法停在 page.evaluate 或 await page.click() 上。
为什么 launch.json 里 type 必须是 pwa-chrome,不能用 node
VSCode 的 node 调试器只跑 JS 引擎本身,不接触浏览器上下文。Puppeteer 是控制远端浏览器的,必须走 Chrome DevTools Protocol(CDP),靠 WebSocket 连接 Chromium 实例。一旦用了 type: "node",你看到的只是 Node 进程里的 Promise 链,page 对象是空壳,console.log 不输出页面日志,断点也永远灰掉。
-
type必须设为"pwa-chrome"(或"pwa-msedge") -
request必须是"attach",不是"launch" -
url填"http://localhost:9222",不是你的目标网页地址 -
webRoot设为"${workspaceFolder}",否则 source map 映射失败,断点落在编译后文件上
如何让 Puppeteer 启动时真正暴露调试端口
默认 puppeteer.launch({ headless: false }) 启动的 Chromium 是不开放调试端口的。devtools: true 只弹窗 DevTools,不暴露 CDP 接口给外部工具——VSCode 连不上,等于没入口。
- 必须显式加参数:
args: ['--remote-debugging-port=9222'] - 如果要观察 UI,保留
headless: false;如果纯无头,也得加这个参数,否则端口不通 - Windows 下注意别写成
'--remote-debugging-port = 9222'(等号前后有空格会失效) - 端口被占?改用
9223,但launch.json和args必须同步改 - Docker/WSL 环境下,加
--remote-debugging-address=127.0.0.1防止绑定到0.0.0.0被拦截
为什么 puppeteer-core + connect() 更稳定
每次 puppeteer.launch() 都会下载独立 Chromium,版本、缓存、扩展全隔离。脚本一结束或抛错,browser 进程退出,CDP 会话就销毁,VSCode 断连,断点失效。换成 puppeteer-core,你手动启 Chrome,再用代码连,生命周期完全可控。
- 手动启动 Chrome:
chrome --remote-debugging-port=9222 --no-first-run - 从
http://localhost:9222/json拿真实的webSocketDebuggerUrl(别手敲、别复用旧链接) - 代码里用
puppeteer.connect({ browserWSEndpoint: 'ws://...' }) - 这样 localStorage、cookie、甚至 DevTools 断点状态都能延续,调试上下文不丢
最容易被忽略的一点:WebSocket URL 必须实时取,http://localhost:9222/json 返回的 webSocketDebuggerUrl 每次启动都变,硬编码或复制 chrome://version/ 里的地址大概率连不上。











