{"id":"63605f7e7c647d2d","repo":"vitest-dev/vitest","slug":"commands-are-only-available-for-browser-tests","errorCode":null,"errorMessage":"Commands are only available for browser tests.","messagePattern":"Commands are only available for browser tests\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/browser/src/node/rpc.ts","lineNumber":329,"sourceCode":"          }\n          return result?.map\n        },\n        cancelCurrentRun(reason) {\n          vitest.cancelCurrentRun(reason)\n        },\n        async resolveId(id, importer) {\n          return mockResolver.resolveId(id, importer)\n        },\n        debug(...args) {\n          vitest.logger.console.debug(...args)\n        },\n        getCountOfFailedTests() {\n          return vitest.state.getCountOfFailedTests()\n        },\n        async wdioSwitchContext(direction) {\n          const provider = project.browser!.provider\n          if (!provider) {\n            throw new Error('Commands are only available for browser tests.')\n          }\n          if (provider.name !== 'webdriverio') {\n            throw new Error('Switch context is only available for WebDriverIO provider.')\n          }\n          if (direction === 'iframe') {\n            await (provider as any).switchToTestFrame()\n          }\n          else {\n            await (provider as any).switchToMainFrame()\n          }\n        },\n        async triggerCommand(sessionId, command, testPath, payload) {\n          debug?.('[%s] Triggering command \"%s\"', sessionId, command)\n          const provider = project.browser!.provider\n          if (!provider) {\n            throw new Error('Commands are only available for browser tests.')\n          }\n          const context = Object.assign(","sourceCodeStart":311,"sourceCodeEnd":347,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/browser/src/node/rpc.ts#L311-L347","documentation":"`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.","triggerScenarios":"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.","commonSituations":"Sharing test helpers between browser and node projects; misconfigured `projects` where the helper runs against the wrong project; provider init failed silently.","solutions":["Ensure the test runs in a project with `test.browser.enabled: true` and a configured provider.","Verify provider init succeeded (check for browser binary / provider package errors).","Guard helper code so iframe-switching only runs for browser projects."],"exampleFix":"// before — helper used by both node and browser projects\nawait switchToTestFrame()\n\n// after\nif (globalThis.__vitest_browser__) {\n  await switchToTestFrame()\n}","handlingStrategy":"type-guard","validationCode":"function isBrowserProject(project: { browser?: { provider?: unknown } }): boolean {\n  return !!project.browser?.provider\n}","typeGuard":"const isBrowserProject = (p: { browser?: { provider?: unknown } }): p is { browser: { provider: object } } =>\n  !!p.browser?.provider","tryCatchPattern":null,"preventionTips":["Run WebDriverIO frame switching only in browser projects.","Gate shared helpers with a project-type check.","Verify provider init when this fires unexpectedly."],"tags":["browser-command","webdriverio","validation","project"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}