{"id":"969e7c48b76b55aa","repo":"vitest-dev/vitest","slug":"browser-provider-is-not-defined-for-the-project-969e7c","errorCode":null,"errorMessage":"Browser provider is not defined for the project \"${browserSession.project.name}\".","messagePattern":"Browser provider is not defined for the project \"(.+?)\"\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/browser/src/node/projectParent.ts","lineNumber":205,"sourceCode":"  }\n\n  public readonly cdps: Map<string, BrowserServerCDPHandler> = new Map()\n  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","sourceCodeStart":187,"sourceCodeEnd":223,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/browser/src/node/projectParent.ts#L187-L223","documentation":"After resolving the session, `ensureCDPHandler` reads `browserSession.project.browser!.provider`. If the provider is undefined (init failed or hasn't run), CDP cannot be established. Unlike error 63 (a config-level check), this fires at runtime during a CDP request.","triggerScenarios":"A CDP call (`cdp.send`, `trackCdpEvent`) on a project whose `BrowserProjectBrowser.provider` is undefined — provider init failed silently, or hasn't completed before the CDP request.","commonSituations":"Provider failed to initialize (e.g. browser binary missing for Playwright) but the test continued; race between provider init and an early CDP call; mismatched provider package versions.","solutions":["Check the test log for provider init errors (missing browser binary, version mismatch).","Ensure `initBrowserProvider` completed before tests that use CDP run.","Reinstall/verify the provider package and browser binaries (e.g. `npx playwright install`).","If init succeeded, this is likely a Vitest bug — report with a reproduction."],"exampleFix":"// before — CDP call before provider ready\nawait cdp.send('Page.reload')\n\n// after — ensure provider initialized\nawait project.browser.initBrowserProvider(project)\nawait cdp.send('Page.reload')","handlingStrategy":"validation","validationCode":"function providerReady(project: { browser?: { provider?: unknown } }): boolean {\n  return !!project.browser?.provider\n}","typeGuard":"const hasProvider = (p: { browser?: { provider?: unknown } }): p is { browser: { provider: object } } =>\n  !!p.browser?.provider","tryCatchPattern":null,"preventionTips":["Wait for provider init to resolve before issuing CDP calls.","Install browser binaries (e.g. `npx playwright install`).","Watch the test log for silent provider init failures."],"tags":["browser-provider","cdp","session","initialization"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}