vitest-dev/vitest · error · Error

Unable to set breakpoint, CDP not supported

Error message

Unable to set breakpoint, CDP not supported

What it means

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.

Source

Thrown at packages/vitest/src/node/pools/browser.ts:450

        })
    }).catch(err => this.reject(err))
  }

  async setBreakpoint(sessionId: string, file: string) {
    if (!this.project.config.inspector.waitForDebugger) {
      return
    }

    const provider = this.project.browser!.provider
    const browser = this.project.config.browser.name

    if (shouldIgnoreDebugger(provider.name, browser)) {
      debug?.('[$s] ignoring debugger in %s browser because it is not supported', sessionId, browser)
      return
    }

    if (!provider.getCDPSession) {
      throw new Error('Unable to set breakpoint, CDP not supported')
    }

    debug?.('[%s] set breakpoint for %s', sessionId, file)
    const session = await provider.getCDPSession(sessionId)
    await session.send('Debugger.enable', {})
    await session.send('Debugger.setBreakpointByUrl', {
      lineNumber: 0,
      urlRegex: escapePathToRegexp(file),
    })
  }
}

function shouldIgnoreDebugger(provider: string, browser: string) {
  if (provider === 'webdriverio') {
    return browser !== 'chrome' && browser !== 'edge'
  }
  return browser !== 'chromium'
}

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Use a Chromium-based browser (chrome, edge, or the 'chromium' name under playwright) so CDP is available.
  2. Disable inspector.waitForDebugger if you do not need the auto-pause debugging flow.
  3. Switch to the playwright provider which exposes getCDPSession for chromium.
  4. If writing a custom provider, implement getCDPSession(sessionId) returning a CDP-capable session.

Example fix

// before: waitForDebugger with a non-CDP provider/browser
export default defineConfig({
  test: {
    browser: { provider: 'webdriverio', name: 'firefox', enabled: true },
    inspector: { waitForDebugger: true },
  },
})

// after: use a CDP-capable chromium browser
export default defineConfig({
  test: {
    browser: { provider: 'playwright', name: 'chromium', enabled: true },
    inspector: { waitForDebugger: true },
  },
})
Defensive patterns

Strategy: validation

Validate before calling

// Confirm the provider/browser combo supports CDP before enabling waitForDebugger
function supportsCDP(provider, browser) {
  if (provider === 'webdriverio') return browser === 'chrome' || browser === 'edge'
  return browser === 'chromium'
}
const { provider, name: browser } = config.browser
if (config.inspector?.waitForDebugger && !supportsCDP(provider, browser)) {
  throw new Error(`waitForDebugger requires a CDP-capable browser, got ${provider}/${browser}`)
}

Type guard

function canUseWaitForDebugger(config) {
  if (!config.inspector?.waitForDebugger) return true
  const { provider, name } = config.browser
  if (provider === 'webdriverio') return name === 'chrome' || name === 'edge'
  return name === 'chromium'
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03). Data as JSON: /data/errors/396169287dc39f27.json. Report an issue: GitHub.