vitest-dev/vitest · error

Browser Mode was enabled, but provider was not specified…

Error message

Browser Mode was enabled, but provider was not specified anywhere. See https://vitest.dev/guide/browser/#configuration

What it means

Browser mode was enabled but no provider could be resolved. The loader checks browser.provider and the first browser.instances[] entry with a provider; if none has a callable serverFactory, it throws. A provider (e.g. playwright) must be configured for browser mode.

Solutions

  1. Set test.browser.provider: 'playwright' (or 'webdriverio') in config.
  2. Install the matching provider package (e.g. @vitest/browser-provider-playwright).
  3. If using instances, set provider on at least one instance (or on browser.provider globally).

Example fix

// before
export default defineConfig({
  test: { browser: { enabled: true, instances: [{ browser: 'chromium' }] } }
})

// after
export default defineConfig({
  test: {
    browser: {
      enabled: true,
      provider: 'playwright',
      instances: [{ browser: 'chromium' }]
    }
  }
})
Defensive patterns

Strategy: validation

Validate before calling

function browserProviderResolved(browser) {
  const provider = browser.provider ?? browser.instances?.find(i => i.provider)?.provider
  return !!provider && typeof provider.serverFactory === 'function'
}
// before enabling browser: if (!browserProviderResolved(config.test.browser)) set provider in config

Type guard

function hasServerFactory(provider): provider is { serverFactory: () => unknown } {
  return provider != null && typeof provider.serverFactory === 'function'
}

Prevention

When it happens

Trigger: test.browser.enabled === true with neither browser.provider set nor any browser.instances[].provider set, so the resolved provider is undefined (or its serverFactory is not a function).

Common situations: Enabling browser mode without installing/configuring a provider; typo in provider name; relying only on instances but forgetting provider on each; provider package not installed.

Related errors


AI-assisted analysis of vitest-dev/vitest@1fa9837ec2 (2026-08-11). Data as JSON: /api/errors/4d7c5f5346ee41c6. Report an issue: GitHub.

Appendix: source

Thrown at packages/vitest/src/node/plugins/browserLoader.ts:57

    {
      name: 'vitest:browser:loader',
      // `pre` so the browser plugins injected via `applyToEnvironment` land before
      // Vite's internal resolver in the `client` environment (so e.g. the
      // `vitest/browser` virtual module wins over the node stub resolution).
      enforce: 'pre',
      async config(viteConfig) {
        const browser = viteConfig.test?.browser
        if (!browser?.enabled) {
          return
        }
        // The provider can be configured at the project level or per instance
        // (e.g. connect mode). All instances in a project share one provider
        // (validated in `resolveTestConfig`), so any instance's server factory
        // builds the shared server.
        const provider = browser.provider
          ?? browser.instances?.find(instance => instance.provider)?.provider
        if (!provider || typeof provider.serverFactory !== 'function') {
          throw new Error(`Browser Mode was enabled, but provider was not specified anywhere. See https://vitest.dev/guide/browser/#configuration`)
        }
        const contribution = await provider.serverFactory()
        captures.browserContribution = contribution
        const browserConfig = await contribution.config(viteConfig, harness)
        const logLevel = viteConfig.logLevel ?? 'warn'
        const logger = createViteLogger(harness.logger, logLevel, {
          allowClearScreen: false,
        })
        return {
          ...browserConfig,
          customLogger: {
            ...logger,
            info(message, options) {
              // https://github.com/vitejs/vite/blob/ba3119397d0110952f29965774c627a3017d7292/packages/vite/src/node/optimizer/optimizer.ts#L76-L86
              // https://github.com/vitejs/vite/blob/ba3119397d0110952f29965774c627a3017d7292/packages/vite/src/node/optimizer/optimizer.ts#L483-L490
              const isOptimizerMessage
                = message.includes('dependency optimized: ')
                  || message.includes('dependencies optimized: ')

View on GitHub (pinned to 1fa9837ec2)