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
- Set test.browser.provider: 'playwright' (or 'webdriverio') in config.
- Install the matching provider package (e.g. @vitest/browser-provider-playwright).
- 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
- Always set test.browser.provider when enabling browser mode.
- Install the matching provider package in devDependencies.
- If using instances, set provider on each (or once on browser.provider).
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
- All browser instances within a project must use the same…
- browser is not initialized
- Browser Mode requires the "provider" to always be specified.
- Browser " " is not supported by the browser provider " "…
- The `browser.provider` configuration was changed to accept…
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)