vitest-dev/vitest · error · Error

${name}Browser "${browser}" is not supported by the browser

Error message

${name}Browser "${browser}" is not supported by the browser provider "${options.provider.name}". Supported browsers: ${supportedBrowsers.join(', ')}.

What it means

Thrown when the requested browser name is not in the provider's supportedBrowser list. Each provider declares which browser engines it can drive; requesting an unsupported one means the provider has no way to launch it.

Source

Thrown at packages/browser/src/node/utils.ts:84

}

export async function getBrowserProvider(
  options: ResolvedBrowserOptions,
  project: TestProject,
): Promise<BrowserProvider> {
  const browser = project.config.browser.name
  const name = project.name ? `[${project.name}] ` : ''
  if (!browser) {
    throw new Error(
      `${name}Browser name is required. Please, set \`test.browser.instances[].browser\` option manually.`,
    )
  }
  if (options.provider == null) {
    throw new Error(`Browser Mode requires the "provider" to always be specified.`)
  }
  const supportedBrowsers = options.provider.supportedBrowser || []
  if (supportedBrowsers.length && !supportedBrowsers.includes(browser)) {
    throw new Error(
      `${name}Browser "${browser}" is not supported by the browser provider "${
        options.provider.name
      }". Supported browsers: ${supportedBrowsers.join(', ')}.`,
    )
  }
  if (typeof options.provider.providerFactory !== 'function') {
    throw new TypeError(`The "${name}" browser provider does not provide a "providerFactory" function. Received ${typeof options.provider.providerFactory}.`)
  }
  return options.provider.providerFactory(project)
}

export function slash(path: string): string {
  return path.replace(/\\/g, '/').replace(/\/+/g, '/')
}

export function assertBrowserFileAccess(project: TestProject, path: string): void {
  const normalized = slash(path)
  if (

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Use the exact engine name the provider lists in its error message (chromium, firefox, webkit for playwright).
  2. For a custom provider, extend its supportedBrowser array to include the engine you request.
  3. Switch to a provider that supports your target engine.

Example fix

// before
export default defineConfig({
  test: {
    browser: {
      provider: 'playwright',
      instances: [{ browser: 'safari' }],
    },
  },
})
// after
export default defineConfig({
  test: {
    browser: {
      provider: 'playwright',
      instances: [{ browser: 'webkit' }],
    },
  },
})
Defensive patterns

Strategy: validation

Validate before calling

const PLAYWRIGHT = ['chromium', 'firefox', 'webkit']
const requested = 'safari'
if (!PLAYWRIGHT.includes(requested)) {
  throw new Error(`Use one of: ${PLAYWRIGHT.join(', ')} (got '${requested}')`)
}

Type guard

function isSupportedBrowser(name: string, supported: string[]): name is string {
  return supported.includes(name)
}

Prevention

When it happens

Trigger: Passing a browser name the provider doesn't recognize, e.g. 'safari' (the engine is 'webkit'), or 'chrome' (the engine is 'chromium') with the playwright provider, or any name absent from provider.supportedBrowser.

Common situations: Using colloquial browser names ('safari', 'chrome', 'edge') instead of the engine names playwright expects ('webkit', 'chromium'); writing a custom provider and forgetting to add an engine to supportedBrowser.

Related errors


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