vitest-dev/vitest · error · Error

Commands are only available for browser tests.

Error message

Commands are only available for browser tests.

What it means

`wdioSwitchContext` reads `project.browser!.provider`. If the project isn't a browser project (no provider initialized), the provider is undefined and the RPC refuses with this message — the call only makes sense for browser tests with a working provider.

Source

Thrown at packages/browser/src/node/rpc.ts:329

          }
          return result?.map
        },
        cancelCurrentRun(reason) {
          vitest.cancelCurrentRun(reason)
        },
        async resolveId(id, importer) {
          return mockResolver.resolveId(id, importer)
        },
        debug(...args) {
          vitest.logger.console.debug(...args)
        },
        getCountOfFailedTests() {
          return vitest.state.getCountOfFailedTests()
        },
        async wdioSwitchContext(direction) {
          const provider = project.browser!.provider
          if (!provider) {
            throw new Error('Commands are only available for browser tests.')
          }
          if (provider.name !== 'webdriverio') {
            throw new Error('Switch context is only available for WebDriverIO provider.')
          }
          if (direction === 'iframe') {
            await (provider as any).switchToTestFrame()
          }
          else {
            await (provider as any).switchToMainFrame()
          }
        },
        async triggerCommand(sessionId, command, testPath, payload) {
          debug?.('[%s] Triggering command "%s"', sessionId, command)
          const provider = project.browser!.provider
          if (!provider) {
            throw new Error('Commands are only available for browser tests.')
          }
          const context = Object.assign(

View on GitHub (pinned to d568f8ce37)

Solutions

  1. Ensure the test runs in a project with `test.browser.enabled: true` and a configured provider.
  2. Verify provider init succeeded (check for browser binary / provider package errors).
  3. Guard helper code so iframe-switching only runs for browser projects.

Example fix

// before — helper used by both node and browser projects
await switchToTestFrame()

// after
if (globalThis.__vitest_browser__) {
  await switchToTestFrame()
}
Defensive patterns

Strategy: type-guard

Validate before calling

function isBrowserProject(project: { browser?: { provider?: unknown } }): boolean {
  return !!project.browser?.provider
}

Type guard

const isBrowserProject = (p: { browser?: { provider?: unknown } }): p is { browser: { provider: object } } =>
  !!p.browser?.provider

Prevention

When it happens

Trigger: Calling the `wdioSwitchContext` RPC (mapped to WebDriverIO's `switchToTestFrame`/`switchToMainFrame`) from a project that has no browser provider — e.g. a node-only project, or before provider init.

Common situations: Sharing test helpers between browser and node projects; misconfigured `projects` where the helper runs against the wrong project; provider init failed silently.

Related errors


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