vitest-dev/vitest · error · Error

browser is not initialized

Error message

browser is not initialized

What it means

Internal path _openBrowserPage (project.ts:468) requires this.browser to be set before opening a browser test page. The browser field is populated during browser provider initialization (_initBrowserProvider / createClusterServer). If a browser-mode test is scheduled but the provider/server never initialized the ProjectBrowser, the page-open attempt throws.

Source

Thrown at packages/vitest/src/node/project.ts:469

   * Import a file using Vite module runner.
   * @param moduleId The ID of the module in Vite module graph
   */
  public import<T>(moduleId: string): Promise<T> {
    return this.runner.import(moduleId)
  }

  /** @internal */
  public _getViteEnvironments(): DevEnvironment[] {
    return Object.values(this.vite.environments || {})
  }

  /** @internal */
  public async _openBrowserPage(sessionId: string, pool: {
    reject: (error: Error) => void
    parallel?: boolean
  }): Promise<void> {
    if (!this.browser) {
      throw new Error(`browser is not initialized`)
    }

    const resolvedUrls = this.browser.vite.resolvedUrls
    const origin = resolvedUrls?.local[0] ?? resolvedUrls?.network[0]
    if (!origin) {
      throw new Error(
        `Can't find browser origin URL for project "${this.name}"`,
      )
    }

    const url = new URL('/__vitest_test__/', origin)
    url.searchParams.set('sessionId', sessionId)
    const otelCarrier = this.vitest._traces.getContextCarrier()
    this.vitest._browserSessions.sessionIds.add(sessionId)
    const sessionPromise = this.vitest._browserSessions.createSession(
      sessionId,
      this,
      pool,

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Ensure @vitest/browser is installed and browser.provider points to an installed provider (playwright or webdriverio).
  2. Verify browser.enabled is true and run via the normal vitest CLI / createVitest path so initialization completes.
  3. If using the programmatic API, await vitest.init() (or the equivalent server-ready step) before triggering browser test execution.
  4. Check earlier logs/output for a suppressed provider-load error; this message is often a downstream symptom.

Example fix

// before: custom runner schedules browser run too early
await vitest.scheduleTestBrowser(spec)

// after: ensure init completed
await vitest.init()
await vitest.runFiles(specs)
Defensive patterns

Strategy: validation

Validate before calling

if (project.isBrowserEnabled() && !project.browser) {
  await project._initBrowserProvider()
}
if (!project.browser) throw new Error('Browser provider failed to initialize; check @vitest/browser install')

Type guard

function browserReady(p: TestProject): boolean {
  return !!p.browser && !!p.browser.provider
}

Prevention

When it happens

Trigger: Calling _openBrowserPage before _initBrowserProvider resolved; browser.enabled is true but the provider failed to load (missing @vitest/browser package, provider not installed); a programmatic API call that schedules browser runs without first awaiting server init.

Common situations: Enabling browser mode in config without installing @vitest/browser; provider name typo (e.g. 'playwright' vs 'playwright.io'); a race where the worker requests a browser page before the server ready event; running browser tests through a custom runner that bypasses vitest's normal startup sequence.

Related errors


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