Skip to content

Browser Config Reference

You can change the browser configuration by updating the test.browser field in your config file. An example of a simple config file:

vitest.config.ts
ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    browser: {
      enabled: true,
      provider: 'playwright',
      instances: [
        {
          browser: 'chromium',
          setupFile: './chromium-setup.js',
        },
      ],
    },
  },
})

Please, refer to the "Config Reference" article for different config examples.

WARNING

All listed options on this page are located within a test property inside the configuration:

vitest.config.js
ts
export default defineConfig({
  test: {
    browser: {},
  },
})

browser.enabled

  • Type: boolean
  • Default: false
  • CLI: --browser, --browser.enabled=false

Run all tests inside a browser by default. Note that --browser only works if you have at least one browser.instances item.

browser.instances

  • Type: BrowserConfig
  • Default: [{ browser: name }]

Defines multiple browser setups. Every config has to have at least a browser field. The config supports your providers configurations:

TIP

To have a better type safety when using built-in providers, you should reference one of these types (for provider that you are using) in your config file:

ts
/// <reference types="@vitest/browser/providers/playwright" />
/// <reference types="@vitest/browser/providers/webdriverio" />

In addition to that, you can also specify most of the project options (not marked with a * icon) and some of the browser options like browser.testerHtmlPath.

WARNING

Every browser config inherits options from the root config:

vitest.config.ts
ts
export default defineConfig({
  test: {
    setupFile: ['./root-setup-file.js'],
    browser: {
      enabled: true,
      testerHtmlPath: './custom-path.html',
      instances: [
        {
          // will have both setup files: "root" and "browser"
          setupFile: ['./browser-setup-file.js'],
          // implicitly has "testerHtmlPath" from the root config
          // testerHtmlPath: './custom-path.html',
        },
      ],
    },
  },
})

During development, Vitest supports only one non-headless configuration. You can limit the headed project yourself by specifying headless: false in the config, or by providing the --browser.headless=false flag, or by filtering projects with --project=chromium flag.

For more examples, refer to the "Multiple Setups" guide.

List of available browser options:

By default, Vitest creates an array with a single element which uses the browser.name field as a browser. Note that this behaviour will be removed with Vitets 4.

Under the hood, Vitest transforms these instances into separate test projects sharing a single Vite server for better caching performance.

browser.name deprecated

  • Type: string
  • CLI: --browser=safari

DANGER

This API is deprecated an will be removed in Vitest 4. Please, use browser.instances option instead.

Run all tests in a specific browser. Possible options in different providers:

  • webdriverio: firefox, chrome, edge, safari
  • playwright: firefox, webkit, chromium
  • custom: any string that will be passed to the provider

browser.headless

  • Type: boolean
  • Default: process.env.CI
  • CLI: --browser.headless, --browser.headless=false

Run the browser in a headless mode. If you are running Vitest in CI, it will be enabled by default.

browser.isolate

  • Type: boolean
  • Default: true
  • CLI: --browser.isolate, --browser.isolate=false

Run every test in a separate iframe.

browser.testerHtmlPath

  • Type: string

A path to the HTML entry point. Can be relative to the root of the project. This file will be processed with transformIndexHtml hook.

browser.api

  • Type: number | { port?, strictPort?, host? }
  • Default: 63315
  • CLI: --browser.api=63315, --browser.api.port=1234, --browser.api.host=example.com

Configure options for Vite server that serves code in the browser. Does not affect test.api option. By default, Vitest assigns port 63315 to avoid conflicts with the development server, allowing you to run both in parallel.

browser.provider experimental

  • Type: 'webdriverio' | 'playwright' | 'preview' | string
  • Default: 'preview'
  • CLI: --browser.provider=playwright

ADVANCED API

The provider API is highly experimental and can change between patches. If you just need to run tests in a browser, use the browser.instances option instead.

Path to a provider that will be used when running browser tests. Vitest provides three providers which are preview (default), webdriverio and playwright. Custom providers should be exported using default export and have this shape:

ts
export interface BrowserProvider {
  name: string
  supportsParallelism: boolean
  getSupportedBrowsers: () => readonly string[]
  beforeCommand?: (command: string, args: unknown[]) => Awaitable<void>
  afterCommand?: (command: string, args: unknown[]) => Awaitable<void>
  getCommandsContext: (sessionId: string) => Record<string, unknown>
  openPage: (sessionId: string, url: string, beforeNavigate?: () => Promise<void>) => Promise<void>
  getCDPSession?: (sessionId: string) => Promise<CDPSession>
  close: () => Awaitable<void>
  initialize(
    ctx: TestProject,
    options: BrowserProviderInitializationOptions
  ): Awaitable<void>
}

browser.providerOptions deprecated

  • Type: BrowserProviderOptions

DANGER

This API is deprecated an will be removed in Vitest 4. Please, use browser.instances option instead.

Options that will be passed down to provider when calling provider.initialize.

ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    browser: {
      providerOptions: {
        launch: {
          devtools: true,
        },
      },
    },
  },
})

TIP

To have a better type safety when using built-in providers, you should reference one of these types (for provider that you are using) in your config file:

ts
/// <reference types="@vitest/browser/providers/playwright" />
/// <reference types="@vitest/browser/providers/webdriverio" />

browser.ui

  • Type: boolean
  • Default: !isCI
  • CLI: --browser.ui=false

Should Vitest UI be injected into the page. By default, injects UI iframe during development.

browser.viewport

  • Type: { width, height }
  • Default: 414x896

Default iframe's viewport.

browser.locators

Options for built-in browser locators.

browser.locators.testIdAttribute

  • Type: string
  • Default: data-testid

Attribute used to find elements with getByTestId locator.

browser.screenshotDirectory

  • Type: string
  • Default: __snapshots__ in the test file directory

Path to the screenshots directory relative to the root.

browser.screenshotFailures

  • Type: boolean
  • Default: !browser.ui

Should Vitest take screenshots if the test fails.

browser.orchestratorScripts

  • Type: BrowserScript[]
  • Default: []

Custom scripts that should be injected into the orchestrator HTML before test iframes are initiated. This HTML document only sets up iframes and doesn't actually import your code.

The script src and content will be processed by Vite plugins. Script should be provided in the following shape:

ts
export interface BrowserScript {
  /**
   * If "content" is provided and type is "module", this will be its identifier.
   *
   * If you are using TypeScript, you can add `.ts` extension here for example.
   * @default `injected-${index}.js`
   */
  id?: string
  /**
   * JavaScript content to be injected. This string is processed by Vite plugins if type is "module".
   *
   * You can use `id` to give Vite a hint about the file extension.
   */
  content?: string
  /**
   * Path to the script. This value is resolved by Vite so it can be a node module or a file path.
   */
  src?: string
  /**
   * If the script should be loaded asynchronously.
   */
  async?: boolean
  /**
   * Script type.
   * @default 'module'
   */
  type?: string
}

browser.testerScripts

  • Type: BrowserScript[]
  • Default: []

DANGER

This API is deprecated an will be removed in Vitest 4. Please, use browser.testerHtmlPath field instead.

Custom scripts that should be injected into the tester HTML before the tests environment is initiated. This is useful to inject polyfills required for Vitest browser implementation. It is recommended to use setupFiles in almost all cases instead of this.

The script src and content will be processed by Vite plugins.

browser.commands

  • Type: Record<string, BrowserCommand>
  • Default: { readFile, writeFile, ... }

Custom commands that can be imported during browser tests from @vitest/browser/commands.

browser.connectTimeout

  • Type: number
  • Default: 60_000

The timeout in milliseconds. If connection to the browser takes longer, the test suite will fail.

INFO

This is the time it should take for the browser to establish the WebSocket connection with the Vitest server. In normal circumstances, this timeout should never be reached.

Released under the MIT License.