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
- Switch to the Playwright or preview provider if you need CDP.
- Guard `cdp.*` usage behind a provider check (e.g. `server.provider === 'playwright'`).
- 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
- Use Playwright or the preview provider when you need CDP.
- Guard `cdp.*` calls behind `server.provider === 'playwright' || server.provider === 'preview'`.
- Find WebDriverIO-equivalent APIs for the operation instead.
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
- Switch context is only available for WebDriverIO provider.
- Browser provider is not defined for the project "${browserSe
- Commands are only available for browser tests.
- bitLength is required
- Negative numbers are not supported
AI-assisted analysis of vitest-dev/vitest@d568f8ce37 (2026-08-03).
Data as JSON: /data/errors/31b59bd799c31650.json.
Report an issue: GitHub.