{"id":"396169287dc39f27","repo":"vitest-dev/vitest","slug":"unable-to-set-breakpoint-cdp-not-supported","errorCode":null,"errorMessage":"Unable to set breakpoint, CDP not supported","messagePattern":"Unable to set breakpoint, CDP not supported","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/vitest/src/node/pools/browser.ts","lineNumber":450,"sourceCode":"        })\n    }).catch(err => this.reject(err))\n  }\n\n  async setBreakpoint(sessionId: string, file: string) {\n    if (!this.project.config.inspector.waitForDebugger) {\n      return\n    }\n\n    const provider = this.project.browser!.provider\n    const browser = this.project.config.browser.name\n\n    if (shouldIgnoreDebugger(provider.name, browser)) {\n      debug?.('[$s] ignoring debugger in %s browser because it is not supported', sessionId, browser)\n      return\n    }\n\n    if (!provider.getCDPSession) {\n      throw new Error('Unable to set breakpoint, CDP not supported')\n    }\n\n    debug?.('[%s] set breakpoint for %s', sessionId, file)\n    const session = await provider.getCDPSession(sessionId)\n    await session.send('Debugger.enable', {})\n    await session.send('Debugger.setBreakpointByUrl', {\n      lineNumber: 0,\n      urlRegex: escapePathToRegexp(file),\n    })\n  }\n}\n\nfunction shouldIgnoreDebugger(provider: string, browser: string) {\n  if (provider === 'webdriverio') {\n    return browser !== 'chrome' && browser !== 'edge'\n  }\n  return browser !== 'chromium'\n}","sourceCodeStart":432,"sourceCodeEnd":468,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/vitest/src/node/pools/browser.ts#L432-L468","documentation":"Thrown by BrowserPool.setBreakpoint when config.inspector.waitForDebugger is enabled but the active browser provider has no getCDPSession method. CDP (Chrome DevTools Protocol) is required to inject a breakpoint that pauses the browser tab until the inspector attaches; providers that do not expose CDP cannot honor the waitForDebugger flow.","triggerScenarios":"config.inspector.waitForDebugger = true AND a browser provider without getCDPSession (e.g. a non-Chromium provider, or webdriverio with a non-chrome/edge browser — see shouldIgnoreDebugger) reaches setBreakpoint at packages/vitest/src/node/pools/browser.ts:449-450.","commonSituations":"Enabling inspector.waitForDebugger with the 'webdriverio' provider against firefox/safari; using a custom browser provider that doesn't implement CDP; mixing inspector debugging with a non-Chromium browser.","solutions":["Use a Chromium-based browser (chrome, edge, or the 'chromium' name under playwright) so CDP is available.","Disable inspector.waitForDebugger if you do not need the auto-pause debugging flow.","Switch to the playwright provider which exposes getCDPSession for chromium.","If writing a custom provider, implement getCDPSession(sessionId) returning a CDP-capable session."],"exampleFix":"// before: waitForDebugger with a non-CDP provider/browser\nexport default defineConfig({\n  test: {\n    browser: { provider: 'webdriverio', name: 'firefox', enabled: true },\n    inspector: { waitForDebugger: true },\n  },\n})\n\n// after: use a CDP-capable chromium browser\nexport default defineConfig({\n  test: {\n    browser: { provider: 'playwright', name: 'chromium', enabled: true },\n    inspector: { waitForDebugger: true },\n  },\n})","handlingStrategy":"validation","validationCode":"// Confirm the provider/browser combo supports CDP before enabling waitForDebugger\nfunction supportsCDP(provider, browser) {\n  if (provider === 'webdriverio') return browser === 'chrome' || browser === 'edge'\n  return browser === 'chromium'\n}\nconst { provider, name: browser } = config.browser\nif (config.inspector?.waitForDebugger && !supportsCDP(provider, browser)) {\n  throw new Error(`waitForDebugger requires a CDP-capable browser, got ${provider}/${browser}`)\n}","typeGuard":"function canUseWaitForDebugger(config) {\n  if (!config.inspector?.waitForDebugger) return true\n  const { provider, name } = config.browser\n  if (provider === 'webdriverio') return name === 'chrome' || name === 'edge'\n  return name === 'chromium'\n}","tryCatchPattern":null,"preventionTips":["Only enable inspector.waitForDebugger with Chromium-based browsers.","Prefer the playwright provider for CDP-based debugging.","Implement getCDPSession on custom providers if you need waitForDebugger."],"tags":["browser","debugger","cdp","inspector","config"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}