{"id":"31b59bd799c31650","repo":"vitest-dev/vitest","slug":"cdp-is-not-supported-by-the-provider-provider-n","errorCode":null,"errorMessage":"CDP is not supported by the provider \"${provider.name}\".","messagePattern":"CDP is not supported by the provider \"(.+?)\"\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/browser/src/node/projectParent.ts","lineNumber":208,"sourceCode":"  private cdpSessionsPromises = new Map<string, Promise<CDPSession>>()\n\n  async ensureCDPHandler(sessionId: string, rpcId: string): Promise<BrowserServerCDPHandler> {\n    const cachedHandler = this.cdps.get(rpcId)\n    if (cachedHandler) {\n      return cachedHandler\n    }\n    const browserSession = this.vitest._browserSessions.getSession(sessionId)\n    if (!browserSession) {\n      throw new Error(`Session \"${sessionId}\" not found.`)\n    }\n\n    const browser = browserSession.project.browser!\n    const provider = browser.provider\n    if (!provider) {\n      throw new Error(`Browser provider is not defined for the project \"${browserSession.project.name}\".`)\n    }\n    if (!provider.getCDPSession) {\n      throw new Error(`CDP is not supported by the provider \"${provider.name}\".`)\n    }\n\n    const session = await this.cdpSessionsPromises.get(rpcId) ?? await (async () => {\n      const promise = provider.getCDPSession!(sessionId).finally(() => {\n        this.cdpSessionsPromises.delete(rpcId)\n      })\n      this.cdpSessionsPromises.set(rpcId, promise)\n      return promise\n    })()\n\n    const rpc = (browser.state as BrowserServerState).testers.get(rpcId)\n    if (!rpc) {\n      throw new Error(`Tester RPC \"${rpcId}\" was not established.`)\n    }\n\n    const handler = new BrowserServerCDPHandler(session, rpc)\n    this.cdps.set(\n      rpcId,","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/browser/src/node/projectParent.ts#L190-L226","documentation":"`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.","triggerScenarios":"Importing and using `cdp` from `vitest/browser` (or calling `sendCdpEvent`/`trackCdpEvent` over RPC) while `test.browser.provider` is `'webdriverio'`.","commonSituations":"Switching a test suite from Playwright to WebDriverIO without removing `cdp.*` calls; sharing helper code across provider configurations.","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."],"exampleFix":"// before\nimport { cdp } from 'vitest/browser'\nawait cdp.send('Page.reload') // runs under webdriverio provider\n\n// after\nimport { server } from 'vitest/browser'\nif (server.provider === 'playwright' || server.provider === 'preview') {\n  await cdp.send('Page.reload')\n}","handlingStrategy":"type-guard","validationCode":"function supportsCdp(provider: { getCDPSession?: unknown } | undefined): boolean {\n  return typeof provider?.getCDPSession === 'function'\n}","typeGuard":"import type { BrowserProvider } from 'vitest/node'\n\nconst isCdpProvider = (p: BrowserProvider | undefined): p is BrowserProvider & {\n  getCDPSession: (sessionId: string) => Promise<import('vitest/node').CDPSession>\n} => typeof p?.getCDPSession === 'function'","tryCatchPattern":null,"preventionTips":["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."],"tags":["cdp","browser-provider","webdriverio","validation"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}