···13321332export interface BrowserProvider {
13331333 name: string
13341334 getSupportedBrowsers(): readonly string[]
13351335- initialize(ctx: Vitest, options: { browser: string }): Awaitable<void>
13351335+ initialize(ctx: Vitest, options: { browser: string; options?: BrowserProviderOptions }): Awaitable<void>
13361336 openPage(url: string): Awaitable<void>
13371337 close(): Awaitable<void>
13381338}
···1340134013411341::: warning
13421342This is an advanced API for library authors. If you just need to run tests in a browser, use the [browser](/config/#browser) option.
13431343+:::
13441344+13451345+#### browser.providerOptions
13461346+13471347+- **Type:** `BrowserProviderOptions`
13481348+- **Version:** Since Vitest 1.0.0-beta.3
13491349+13501350+Options that will be passed down to provider when calling `provider.initialize`.
13511351+13521352+```ts
13531353+export default defineConfig({
13541354+ test: {
13551355+ browser: {
13561356+ providerOptions: {
13571357+ launch: {
13581358+ devtools: true,
13591359+ }
13601360+ }
13611361+ }
13621362+ }
13631363+})
13641364+```
13651365+13661366+::: tip
13671367+To have a better type safety when using built-in providers, you can add one of these types (for provider that you are using) to your tsconfig's `compilerOptions.types` field:
13681368+13691369+```json
13701370+{
13711371+ "compilerOptions": {
13721372+ "types": [
13731373+ "@vitest/browser/providers/webdriverio",
13741374+ "@vitest/browser/providers/playwright"
13751375+ ]
13761376+ }
13771377+}
13781378+```
13431379:::
1344138013451381#### browser.slowHijackESM
···11+import type { BrowserProvider } from 'vitest/nide'
22+33+declare var webdriverio: BrowserProvider
44+declare var playwright: BrowserProvider
55+66+export { webdriverio, playwright }
···11import type { Vitest } from 'vitest'
22import { describe, expect, test, vi } from 'vitest'
33-import type { VitestWorkspace } from 'vitest/node'
33+import type { WorkspaceProject } from 'vitest/node'
44import { RandomSequencer } from '../../../packages/vitest/src/node/sequencers/RandomSequencer'
55import { BaseSequencer } from '../../../packages/vitest/src/node/sequencers/BaseSequencer'
66import type { WorkspaceSpec } from '../../../packages/vitest/src/node/pool'
···2020function buildWorkspace() {
2121 return {
2222 getName: () => 'test',
2323- } as any as VitestWorkspace
2323+ } as any as WorkspaceProject
2424}
25252626const workspace = buildWorkspace()
···11-import { PlaywrightBrowserProvider } from '../node/browser/playwright'
22-import { WebdriverBrowserProvider } from '../node/browser/webdriver'
11+import { ensurePackageInstalled } from '../node/pkg'
32import type { BrowserProviderModule, ResolvedBrowserOptions } from '../types/browser'
4354interface Loader {
66- executeId: (id: string) => Promise<{ default: BrowserProviderModule }>
55+ root: string
66+ executeId: (id: string) => any
77}
8899export async function getBrowserProvider(options: ResolvedBrowserOptions, loader: Loader): Promise<BrowserProviderModule> {
1010- switch (options.provider) {
1111- case undefined:
1212- case 'webdriverio':
1313- return WebdriverBrowserProvider
1414-1515- case 'playwright':
1616- return PlaywrightBrowserProvider
1717-1818- default:
1919- break
1010+ if (options.provider == null || options.provider === 'webdriverio' || options.provider === 'playwright') {
1111+ await ensurePackageInstalled('@vitest/browser', loader.root)
1212+ const providers = await loader.executeId('@vitest/browser/providers') as {
1313+ webdriverio: BrowserProviderModule
1414+ playwright: BrowserProviderModule
1515+ }
1616+ const provider = (options.provider || 'webdriverio') as 'webdriverio' | 'playwright'
1717+ return providers[provider]
2018 }
21192220 let customProviderModule
23212422 try {
2525- customProviderModule = await loader.executeId(options.provider)
2323+ customProviderModule = await loader.executeId(options.provider) as { default: BrowserProviderModule }
2624 }
2725 catch (error) {
2826 throw new Error(`Failed to load custom BrowserProvider from ${options.provider}`, { cause: error })
+4-1
packages/vitest/src/node/index.ts
···11export type { Vitest } from './core'
22-export type { WorkspaceProject as VitestWorkspace } from './workspace'
22+export type { WorkspaceProject } from './workspace'
33export { createVitest } from './create'
44export { VitestPlugin } from './plugins'
55export { startVitest } from './cli-api'
···8899export type { TestSequencer, TestSequencerConstructor } from './sequencers/types'
1010export { BaseSequencer } from './sequencers/BaseSequencer'
1111+1212+export { ensurePackageInstalled } from './pkg'
1313+export type { BrowserProviderInitializationOptions, BrowserProvider, BrowserProviderOptions } from '../types/browser'
+2-1
packages/vitest/src/node/workspace.ts
···356356 throw new Error(`[${this.getName()}] Browser name is required. Please, set \`test.browser.name\` option manually.`)
357357 if (!supportedBrowsers.includes(browser))
358358 throw new Error(`[${this.getName()}] Browser "${browser}" is not supported by the browser provider "${this.browserProvider.name}". Supported browsers: ${supportedBrowsers.join(', ')}.`)
359359- await this.browserProvider.initialize(this, { browser })
359359+ const providerOptions = this.config.browser.providerOptions
360360+ await this.browserProvider.initialize(this, { browser, options: providerOptions })
360361 }
361362}
+1-1
packages/vitest/src/runtime/child.ts
···88import type { ResolvedConfig, WorkerGlobalState } from '../types'
99import type { RunnerRPC, RuntimeRPC } from '../types/rpc'
1010import type { ChildContext } from '../types/child'
1111-import { loadEnvironment } from '../integrations/env'
1111+import { loadEnvironment } from '../integrations/env/loader'
1212import { mockMap, moduleCache, startViteNode } from './execute'
1313import { createSafeRpc, rpcDone } from './rpc'
1414import { setupInspect } from './inspector'
+1-1
packages/vitest/src/runtime/vm.ts
···99import type { CancelReason } from '@vitest/runner'
1010import type { RunnerRPC, RuntimeRPC, WorkerContext, WorkerGlobalState } from '../types'
1111import { distDir } from '../paths'
1212-import { loadEnvironment } from '../integrations/env'
1212+import { loadEnvironment } from '../integrations/env/loader'
1313import { startVitestExecutor } from './execute'
1414import { createCustomConsole } from './console'
1515import { createSafeRpc } from './rpc'
+1-1
packages/vitest/src/runtime/worker.ts
···44import type { CancelReason } from '@vitest/runner'
55import type { RunnerRPC, RuntimeRPC, WorkerContext, WorkerGlobalState } from '../types'
66import { getWorkerState } from '../utils/global'
77-import { loadEnvironment } from '../integrations/env'
77+import { loadEnvironment } from '../integrations/env/loader'
88import { mockMap, moduleCache, startViteNode } from './execute'
99import { setupInspect } from './inspector'
1010import { createSafeRpc, rpcDone } from './rpc'
+18-3
packages/vitest/src/types/browser.ts
···22import type { WorkspaceProject } from '../node/workspace'
33import type { ApiConfig } from './config'
4455-export interface BrowserProviderOptions {
55+export interface BrowserProviderInitializationOptions {
66 browser: string
77+ options?: BrowserProviderOptions
78}
89910export interface BrowserProvider {
1011 name: string
1112 getSupportedBrowsers(): readonly string[]
1212- initialize(ctx: WorkspaceProject, options: BrowserProviderOptions): Awaitable<void>
1313+ initialize(ctx: WorkspaceProject, options: BrowserProviderInitializationOptions): Awaitable<void>
1314 openPage(url: string): Awaitable<void>
1415 catchError(cb: (error: Error) => Awaitable<void>): () => Awaitable<void>
1516 close(): Awaitable<void>
···1819export interface BrowserProviderModule {
1920 new (): BrowserProvider
2021}
2222+2323+export interface BrowserProviderOptions {}
21242225export interface BrowserConfigOptions {
2326 /**
···3336 name: string
34373538 /**
3636- * browser provider
3939+ * Browser provider
3740 *
3841 * @default 'webdriverio'
3942 */
4043 provider?: 'webdriverio' | 'playwright' | (string & {})
4444+4545+ /**
4646+ * Options that are passed down to a browser provider.
4747+ * To support type hinting, add one of the types to your tsconfig.json "compilerOptions.types" field:
4848+ *
4949+ * - for webdriverio: `@vitest/browser/providers/webdriverio`
5050+ * - for playwright: `@vitest/browser/providers/playwright`
5151+ *
5252+ * @example
5353+ * { playwright: { launch: { devtools: true } }
5454+ */
5555+ providerOptions?: BrowserProviderOptions
41564257 /**
4358 * enable headless mode