vitest-dev/vitest · error · Error

CDP is not supported by the provider "${provider.name}".

Error message

CDP is not supported by the provider "${provider.name}".

What it means

`ensureCDPHandler` checks for `provider.getCDPSession`. Only CDP-capable providers (Playwright, preview) implement it; WebDriverIO does not, because it speaks the WebDriver protocol instead of CDP. Requesting CDP on a non-CDP provider is rejected.

Source

Thrown at packages/browser/src/node/projectParent.ts:208

  private cdpSessionsPromises = new Map<string, Promise<CDPSession>>()

  async ensureCDPHandler(sessionId: string, rpcId: string): Promise<BrowserServerCDPHandler> {
    const cachedHandler = this.cdps.get(rpcId)
    if (cachedHandler) {
      return cachedHandler
    }
    const browserSession = this.vitest._browserSessions.getSession(sessionId)
    if (!browserSession) {
      throw new Error(`Session "${sessionId}" not found.`)
    }

    const browser = browserSession.project.browser!
    const provider = browser.provider
    if (!provider) {
      throw new Error(`Browser provider is not defined for the project "${browserSession.project.name}".`)
    }
    if (!provider.getCDPSession) {
      throw new Error(`CDP is not supported by the provider "${provider.name}".`)
    }

    const session = await this.cdpSessionsPromises.get(rpcId) ?? await (async () => {
      const promise = provider.getCDPSession!(sessionId).finally(() => {
        this.cdpSessionsPromises.delete(rpcId)
      })
      this.cdpSessionsPromises.set(rpcId, promise)
      return promise
    })()

    const rpc = (browser.state as BrowserServerState).testers.get(rpcId)
    if (!rpc) {
      throw new Error(`Tester RPC "${rpcId}" was not established.`)
    }

    const handler = new BrowserServerCDPHandler(session, rpc)
    this.cdps.set(
      rpcId,

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Switch to the Playwright or preview provider if you need CDP.
  2. Guard `cdp.*` usage behind a provider check (e.g. `server.provider === 'playwright'`).
  3. Use WebDriverIO-equivalent APIs for the operation you needed CDP for.

Example fix

// before
import { cdp } from 'vitest/browser'
await cdp.send('Page.reload') // runs under webdriverio provider

// after
import { server } from 'vitest/browser'
if (server.provider === 'playwright' || server.provider === 'preview') {
  await cdp.send('Page.reload')
}
Defensive patterns

Strategy: type-guard

Validate before calling

function supportsCdp(provider: { getCDPSession?: unknown } | undefined): boolean {
  return typeof provider?.getCDPSession === 'function'
}

Type guard

import type { BrowserProvider } from 'vitest/node'

const isCdpProvider = (p: BrowserProvider | undefined): p is BrowserProvider & {
  getCDPSession: (sessionId: string) => Promise<import('vitest/node').CDPSession>
} => typeof p?.getCDPSession === 'function'

Prevention

When it happens

Trigger: Importing and using `cdp` from `vitest/browser` (or calling `sendCdpEvent`/`trackCdpEvent` over RPC) while `test.browser.provider` is `'webdriverio'`.

Common situations: Switching a test suite from Playwright to WebDriverIO without removing `cdp.*` calls; sharing helper code across provider configurations.

Related errors


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