# webdriverio/webdriverio — codebase unpack

> Canonical page: https://codevetter.com/unpack/webdriverio

This is a deterministic Repo Unpack scan of webdriverio/webdriverio — a structural map, not a review, security audit, or maintainer-endorsed description.

- Scanned commit: dbf0f497130676040ce4212d9cf6459adfe16c42 (2026-10-01)
- Last upstream commit: feat: upgrade to expect-wdio 7 for multiRemote support (#15838)
- Generated by codevetter 1.15.0 on 2026-10-02
- 797 files scanned · 2.9 MB

Source inspection; upstream code and tests were not executed.

## Languages

- Markdown: 251 files
- JSON: 169 files
- YAML: 40 files
- TypeScript: 26 files
- CSS: 19 files
- HTML: 4 files
- JavaScript: 4 files
- Vue: 3 files

## Repository structure

- packages/ — 357 files
- website/ — 267 files
- .github/ — 40 files
- e2e/ — 38 files
- examples/ — 31 files
- tests/ — 26 files
- scripts/ — 5 files
- infra/ — 4 files

Probable source entrypoint: `packages/` (inferred from the tree, not upstream docs)

## Package

- package.json: webdriverio-monorepo — 61 declared dependencies

## Structural health signals

Average score 8.5/10 across 28 files; 1 hotspots. These are deterministic review leads, not proof of a bug.

## Recent history

- dbf0f4971306 (2026-10-01) feat: upgrade to expect-wdio 7 for multiRemote support (#15838)
- b148655db4b8 (2026-10-01) fix(@wdio/utils): do not log short strings as screenshots (#15805)
- e81b20094c9c (2026-10-01) feat(create-wdio): offer the devtools service in the wizard (#15848)
- 4be5cb2e3eea (2026-09-30) docs(devtools): add a mobile page and follow the examples rename (#15687)
- f1718757ba44 (2026-09-29) chore(deps): bump morgan from 1.12.0 to 1.12.1 (#15809)

## Overview

WebdriverIO is a Node.js automation framework for developers testing websites, browser components, and mobile applications through WebDriver, WebDriver BiDi, and Appium. This monorepo combines standalone browser clients, a CLI that schedules isolated test workers, framework adapters, services, reporters, and a Vite-based browser runner. Its distinctive architecture layers resilient element commands and session managers over protocol bindings while allowing runners, commands, locators, and integrations to be extended.

## System map

The product is a collection of cooperating packages rather than one deployed application. Standalone clients and CLI test execution share protocol bindings but have different lifecycle owners. Node workers, real browsers, driver processes, and optional cloud backends form the principal runtime boundaries. Build artifacts are published as packages, while the documentation website has a separate deployment workflow.
- The private ESM root workspace selects pnpm 10.34.5; workspace membership includes packages, compiler infrastructure, website, e2e, typing fixtures, and selected examples. — [package.json#L1-L5](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/package.json#L1-L5) [pnpm-workspace.yaml#L1-L17](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/pnpm-workspace.yaml#L1-L17)
- webdriverio exposes browser, Node ESM, and CommonJS entrypoints; its Node source installs filesystem-backed helpers and process environment access into the shared environment object. — [packages/webdriverio/package.json#L46-L64](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/package.json#L46-L64) [packages/webdriverio/src/node.ts#L1-L26](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node.ts#L1-L26)
- The webdriver package owns session creation and protocol composition: WebDriver.newSession starts a driver, negotiates capabilities, constructs a client monad, and optionally connects BiDi. — [packages/webdriver/src/index.ts#L20-L100](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/index.ts#L20-L100)
- The wdio executable imports the compiled CLI; run() dispatches registered commands or treats a configuration path as the default run command. — [packages/wdio-cli/bin/wdio.js#L7-L17](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/bin/wdio.js#L7-L17) [packages/wdio-cli/src/run.ts#L24-L68](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/run.ts#L24-L68)
- Launcher owns capability scheduling and worker capacity; local workers execute @wdio/runner and exchange commands and results through Node IPC. — [packages/wdio-cli/src/launcher.ts#L376-L439](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L376-L439) [packages/wdio-local-runner/src/worker.ts#L157-L171](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-local-runner/src/worker.ts#L157-L171) [packages/wdio-local-runner/src/run.ts#L22-L45](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-local-runner/src/run.ts#L22-L45)
- BrowserRunner extends LocalRunner, requires Mocha, starts Vite servers for worker runs, registers a server-worker communicator, and aggregates coverage during shutdown. — [packages/wdio-browser-runner/src/index.ts#L27-L50](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-browser-runner/src/index.ts#L27-L50) [packages/wdio-browser-runner/src/index.ts#L92-L149](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-browser-runner/src/index.ts#L92-L149)
- The inspected storage boundaries are caller-selected artifact files and an optional process-memory shared store served over loopback HTTP. — [packages/webdriverio/src/node/saveScreenshot.ts#L43-L57](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L43-L57) [packages/wdio-shared-store-service/src/server.ts#L7-L13](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/server.ts#L7-L13) [packages/wdio-shared-store-service/src/server.ts#L115-L121](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/server.ts#L115-L121)
- Root scripts define build, unit, typing, smoke, component, and e2e checks; CI uploads compiled package artifacts, manual publishing invokes Lerna, and documentation deployment invokes the separate docs pipeline. — [package.json#L9-L62](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/package.json#L9-L62) [.github/workflows/build.yml#L22-L34](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/build.yml#L22-L34) [.github/workflows/publish.yml#L50-L63](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/publish.yml#L50-L63) [.github/workflows/deploy.yml#L5-L28](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/deploy.yml#L5-L28)

## Feature catalog

The inspected public surface spans direct automation APIs and configuration-driven test execution. Browser and element command barrels expose navigation, inspection, interaction, waiting, emulation, and artifact operations. Mobile commands and cloud endpoint selection extend the same client model beyond desktop browsers. Browser component testing, network mocking, snapshots, and shared resource pools have explicit runtime conditions.
- remote creates a session, attach wraps an existing session, and multiremote coordinates named browser sessions; multiremote initialization opens constituent sessions concurrently. — [packages/webdriverio/src/index.ts#L40-L86](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/index.ts#L40-L86) [packages/webdriverio/src/index.ts#L89-L119](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/index.ts#L89-L119) [packages/webdriverio/src/index.ts#L141-L175](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/index.ts#L141-L175)
- The CLI registers config, install, repl, and run; run accepts suite/spec selection, exclusions, repetition, sharding, headless mode, watch mode, snapshot updates, and CPU/heap profiling options. — [packages/wdio-cli/src/commands/index.ts#L2-L9](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/commands/index.ts#L2-L9) [packages/wdio-cli/src/commands/run.ts#L21-L141](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/commands/run.ts#L21-L141)
- Browser exports include URL/window/frame navigation, cookies, synchronous/asynchronous script execution, keyboard and pointer actions, viewport sizing, emulation, throttling, and Puppeteer access. — [packages/webdriverio/src/commands/browser.ts#L1-L44](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/browser.ts#L1-L44)
- Element exports include value entry, clicking, dragging, selection, text/attribute/CSS inspection, accessibility role/label retrieval, state checks, shadow/React selectors, and explicit wait commands. — [packages/webdriverio/src/commands/element.ts#L1-L56](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/element.ts#L1-L56)
- Mobile exports cover native/webview contexts, app lifecycle, deep links, gestures, clipboard, device locking, connectivity controls, biometrics, and emulator telephony/power operations. — [packages/webdriverio/src/commands/browser.ts#L48-L91](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/browser.ts#L48-L91) [packages/webdriverio/src/commands/element.ts#L60-L64](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/element.ts#L60-L64)
- detectBackend selects BrowserStack, TestingBot, Sauce Labs, or LambdaTest defaults using credential shape and provider options; explicit connection values can override those defaults. — [packages/webdriverio/src/utils/detectBackend.ts#L44-L105](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/detectBackend.ts#L44-L105) [packages/webdriverio/src/utils/detectBackend.ts#L108-L141](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/detectBackend.ts#L108-L141)
- Browser component testing uses Vite and documented React, Preact, Vue, Svelte, Solid, and Stencil presets; the implementation rejects frameworks other than Mocha. — [website/docs/Runner.md#L42-L68](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/website/docs/Runner.md#L42-L68) [packages/wdio-browser-runner/src/index.ts#L40-L44](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-browser-runner/src/index.ts#L40-L44)
- BiDi-only browser.mock replaces identical mock definitions; screenshot capture supports Classic PNG or BiDi PNG/JPEG options, while runner services supply snapshots, soft assertions, and shared-store get/set/resource-pool APIs. — [packages/webdriverio/src/commands/browser/mock.ts#L122-L149](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/browser/mock.ts#L122-L149) [packages/webdriverio/src/node/saveScreenshot.ts#L64-L109](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L64-L109) [packages/wdio-runner/src/index.ts#L88-L97](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L88-L97) [packages/wdio-shared-store-service/src/service.ts#L25-L67](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/service.ts#L25-L67)

## Data flow

Configuration is executable input that becomes launcher scheduling state and is reconstructed in each worker. Session requests transform requested capabilities into negotiated capabilities and protocol-specific client state. Element lookup preserves references and selectors so middleware can recover from missing or stale elements. Outputs cross distinct boundaries: IPC reporting, driver HTTP/WebSocket traffic, local artifact files, and optional loopback shared-store requests.
- ConfigParser.initialize loads the configuration module once, merges overrides, and applies CLI headless settings; addConfigFile extracts capabilities and hooks before deep-merging remaining configuration. — [packages/wdio-config/src/node/ConfigParser.ts#L78-L121](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-config/src/node/ConfigParser.ts#L78-L121) [packages/wdio-config/src/node/ConfigParser.ts#L128-L175](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-config/src/node/ConfigParser.ts#L128-L175)
- getSpecs resolves configured files, applies capability specs unless CLI --spec is present, combines requested suites, deduplicates, conditionally repeats, filters exclusions, and then shards. — [packages/wdio-config/src/node/ConfigParser.ts#L312-L389](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-config/src/node/ConfigParser.ts#L312-L389) [packages/wdio-config/src/node/ConfigParser.ts#L565-L574](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-config/src/node/ConfigParser.ts#L565-L574)
- Launcher structured-clones capabilities for each worker, runs onWorkerStart hooks, and passes configuration path, selected specs, credentials, execArgv, and retries to runner.run. — [packages/wdio-cli/src/launcher.ts#L569-L597](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L569-L597)
- startWebDriverSession converts flat capabilities to alwaysMatch/firstMatch, requests BiDi except for enforced Classic or Safari, normalizes overlaps, sends POST /session, and writes negotiated capabilities back to params. — [packages/webdriver/src/utils.ts#L61-L102](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/utils.ts#L61-L102) [packages/webdriver/src/utils.ts#L108-L149](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/utils.ts#L108-L149) [packages/webdriver/src/utils.ts#L153-L174](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/utils.ts#L153-L174)
- Protocol command wrappers validate arguments, encode endpoint variables, construct an unmasked request body, produce masked event/log payloads, and delegate execution to environment.value.Request. — [packages/webdriver/src/command.ts#L78-L140](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/command.ts#L78-L140) [packages/webdriver/src/command.ts#L151-L175](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/command.ts#L151-L175)
- getElement converts protocol references into client objects containing elementId, selector, parent, and optional BiDi locator; the element command wrapper uses these fields for waiting and stale-reference recovery. — [packages/webdriverio/src/utils/getElementObject.ts#L43-L101](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/getElementObject.ts#L43-L101) [packages/webdriverio/src/middlewares.ts#L23-L73](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/middlewares.ts#L23-L73)
- Worker browser command/result events become reporter events; BaseReporter fans out events, sends output through IPC when available, and shutdown waits for reporter synchronization before emitting exit. — [packages/wdio-runner/src/index.ts#L347-L358](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L347-L358) [packages/wdio-runner/src/reporter.ts#L79-L99](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/reporter.ts#L79-L99) [packages/wdio-runner/src/reporter.ts#L161-L198](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/reporter.ts#L161-L198) [packages/wdio-runner/src/index.ts#L487-L499](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L487-L499)
- Shared-store launcher startup injects the server port into capabilities; worker service setup installs browser.sharedStore, whose client serializes JSON over loopback HTTP into an object store or resource-pool Map. — [packages/wdio-shared-store-service/src/launcher.ts#L15-L40](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/launcher.ts#L15-L40) [packages/wdio-shared-store-service/src/service.ts#L11-L39](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/service.ts#L11-L39) [packages/wdio-shared-store-service/src/client.ts#L14-L56](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/client.ts#L14-L56) [packages/wdio-shared-store-service/src/server.ts#L7-L8](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/server.ts#L7-L8)

## Behavior traces

Three concrete flows were followed through implementation: CLI test execution, element lookup and click, and screenshot persistence. Startup includes configuration import, worker scheduling, framework discovery, session creation, and teardown. Element interaction changes behavior according to runner environment, protocol support, and error conditions. Screenshot persistence separates capture selection from filesystem output.
- Startup 1: wdio.js imports the compiled CLI → run() parses commands → the run handler checks the configuration path and resolves TypeScript settings → launch() constructs Launcher and calls run(); --watch instead enters Watcher.watch(). — [packages/wdio-cli/bin/wdio.js#L14-L17](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/bin/wdio.js#L14-L17) [packages/wdio-cli/src/run.ts#L24-L68](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/run.ts#L24-L68) [packages/wdio-cli/src/commands/run.ts#L175-L205](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/commands/run.ts#L175-L205) [packages/wdio-cli/src/commands/run.ts#L216-L268](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/commands/run.ts#L216-L268)
- Startup 2: Launcher.run → initialize/ConfigParser.initialize → runner plugin construction → launcher services → runner.initialize → user and service onPrepare hooks → driver/browser setup → _runMode/_runSpecs → _startInstance and runner.run. — [packages/wdio-cli/src/launcher.ts#L76-L149](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L76-L149) [packages/wdio-cli/src/launcher.ts#L179-L215](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L179-L215) [packages/wdio-cli/src/launcher.ts#L427-L436](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L427-L436) [packages/wdio-cli/src/launcher.ts#L569-L597](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L569-L597)
- Startup 3: worker IPC dispatch invokes Runner.run → worker config import → stub session → worker services and beforeSession → reporters/framework discovery → real _initSession when tests exist → before hook → framework.run → endSession outside watch mode → snapshot IPC → _shutdown. — [packages/wdio-local-runner/src/run.ts#L37-L45](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-local-runner/src/run.ts#L37-L45) [packages/wdio-runner/src/index.ts#L50-L65](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L50-L65) [packages/wdio-runner/src/index.ts#L119-L173](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L119-L173) [packages/wdio-runner/src/index.ts#L240-L271](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L240-L271)
- Action 1: browser.$ delegates string selectors through globalThis.wdio in browser-runner mode; otherwise it calls findElement and getElement. Eligible BiDi string lookups use findDeepElement, while regular lookups dispatch findElement or findElementFromElement. — [packages/webdriverio/src/commands/browser/$.ts#L68-L99](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/browser/%24.ts#L68-L99) [packages/webdriverio/src/utils/index.ts#L821-L876](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/index.ts#L821-L876) [packages/webdriverio/src/utils/getElementObject.ts#L43-L101](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/getElementObject.ts#L43-L101)
- Action 2: getElement installs elementErrorHandler(wrapCommand) → implicitWait waits and requeries missing elements except explicit waits/state checks and selected native scroll operations → middleware updates elementId → command executes; non-interactable and stale failures enter separate recovery branches. — [packages/webdriverio/src/utils/getElementObject.ts#L99-L101](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/getElementObject.ts#L99-L101) [packages/webdriverio/src/utils/implicitWait.ts#L11-L26](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/implicitWait.ts#L11-L26) [packages/webdriverio/src/middlewares.ts#L16-L73](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/middlewares.ts#L16-L73)
- Action 3: click without options calls elementClick → POST /session/:sessionId/element/:elementId/click → request.makeRequest; intercepted clicks scroll to center and retry. Options instead build pointer move/down/pause/up actions and honor skipRelease. — [packages/webdriverio/src/commands/element/click.ts#L109-L150](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/element/click.ts#L109-L150) [packages/webdriverio/src/commands/element/click.ts#L154-L202](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/element/click.ts#L154-L202) [packages/wdio-protocols/src/protocols/webdriver.ts#L953-L965](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-protocols/src/protocols/webdriver.ts#L953-L965) [packages/webdriver/src/command.ts#L157-L175](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/command.ts#L157-L175)
- Persistence 1: browser.saveScreenshot → environment.value.saveScreenshot installed by node.ts → Node saveScreenshot checks filepath type → path.resolve → assertDirectoryExists → chooses takeScreenshotClassic or takeScreenshotBidi. — [packages/webdriverio/src/commands/browser/saveScreenshot.ts#L51-L59](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/browser/saveScreenshot.ts#L51-L59) [packages/webdriverio/src/node.ts#L16-L25](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node.ts#L16-L25) [packages/webdriverio/src/node/saveScreenshot.ts#L35-L52](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L35-L52) [packages/webdriverio/src/node/utils.ts#L7-L11](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/utils.ts#L7-L11)
- Persistence 2: Classic validates PNG/no options and calls takeScreenshot; BiDi obtains context/tree, validates format/quality/clip, and uses an html element screenshot inside an iframe or browsingContextCaptureScreenshot otherwise. The returned base64 becomes a Buffer, fs.writeFile persists it, and the Buffer is returned. — [packages/webdriverio/src/node/saveScreenshot.ts#L54-L72](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L54-L72) [packages/webdriverio/src/node/saveScreenshot.ts#L79-L109](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L79-L109) [packages/webdriverio/src/node/saveScreenshot.ts#L116-L141](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L116-L141)

## Testing signals

Tests and CI were inspected, not executed; their existence does not establish passing results. The bounded inspection found Vitest unit tests, type compilation fixtures, a custom smoke harness, real-browser e2e suites, and component tests. Mock-heavy unit coverage is complemented by selected integration tests, but configuration deliberately suppresses some error and coverage signals. CI execution depends on changed paths, branch, operating system, and selected matrix mode.
- The inspected unit suite uses Vitest and packages/**/*.test.ts, globally installs a fetch mock, and sets WDIO_SKIP_DRIVER_SETUP=1; this investigation produced no unit-test execution result. — [vitest.config.ts#L1-L19](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L1-L19) [vitest.config.ts#L41-L44](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L41-L44) [package.json#L48-L50](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/package.json#L48-L50)
- Unit configuration sets dangerouslyIgnoreUnhandledErrors and typecheck.ignoreSourceErrors, disables coverage by default, and excludes the BiDi handler from coverage; watermark values are configured but are not evidence of achieved coverage. — [vitest.config.ts#L5-L10](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L5-L10) [vitest.config.ts#L23-L39](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L23-L39)
- Screenshot unit tests mock filesystem access/writes and browser capture calls; inspected cases cover Classic options rejection, BiDi iframe/full-page/clip behavior, and invalid format, extension, quality, or clip inputs. — [packages/webdriverio/tests/node/saveScreenshot.test.ts#L6-L33](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/tests/node/saveScreenshot.test.ts#L6-L33) [packages/webdriverio/tests/node/saveScreenshot.test.ts#L35-L113](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/tests/node/saveScreenshot.test.ts#L35-L113)
- Request tests mock Undici and fetch, then assert fresh timeout signals across retries, preservation of transformRequest signals, per-session dispatcher reuse, and cleanup specifically on session deletion. — [packages/webdriver/tests/request.test.ts#L14-L24](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/tests/request.test.ts#L14-L24) [packages/webdriver/tests/request.test.ts#L516-L579](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/tests/request.test.ts#L516-L579) [packages/webdriver/tests/request.test.ts#L659-L713](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/tests/request.test.ts#L659-L713)
- Launcher tests mock config, logging, and driver setup; inspected test declarations cover retry requeue ordering, worker limits, grouped specs, hooks, and shutdown. Shared-store tests instead explicitly start a server and issue fetch requests. — [packages/wdio-cli/tests/launcher.test.ts#L12-L25](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/tests/launcher.test.ts#L12-L25) [packages/wdio-cli/tests/launcher.test.ts#L303-L389](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/tests/launcher.test.ts#L303-L389) [packages/wdio-cli/tests/launcher.test.ts#L489-L690](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/tests/launcher.test.ts#L489-L690) [packages/wdio-shared-store-service/tests/server.test.ts#L21-L57](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/tests/server.test.ts#L21-L57)
- The smoke harness runs selected tests sequentially in CI and all tests concurrently locally without a filter; contributor documentation explains that its mock WebDriver service supplies predefined driver responses. — [tests/smoke.runner.js#L45-L70](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/tests/smoke.runner.js#L45-L70) [CONTRIBUTING.md#L82-L86](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/CONTRIBUTING.md#L82-L86)
- Real-browser examples include DOM snapshots and masked input, while React component tests render and click a component. However, the Preact and miscellaneous component scripts use successful echo commands before ||, bypassing their wdio commands. — [e2e/wdio/headless/test.e2e.ts#L45-L59](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/e2e/wdio/headless/test.e2e.ts#L45-L59) [e2e/browser-runner/react.test.tsx#L11-L28](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/e2e/browser-runner/react.test.tsx#L11-L28) [e2e/package.json#L11-L13](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/e2e/package.json#L11-L13) [e2e/package.json#L29-L29](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/e2e/package.json#L29-L29)
- Inspected CI selects suites by changed paths, uses full or reduced Node/OS unit matrices, gates cloud tests to main, and builds English plus Arabic documentation. Typing checks compile webdriver, webdriverio, Mocha, Jasmine, and Cucumber fixtures; none of these checks was executed here. — [.github/workflows/test.yml#L36-L85](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/test.yml#L36-L85) [.github/workflows/test-unit.yml#L20-L26](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/test-unit.yml#L20-L26) [.github/workflows/test.yml#L146-L151](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/test.yml#L146-L151) [.github/workflows/test-docs.yml#L28-L50](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/test-docs.yml#L28-L50) [package.json#L42-L47](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/package.json#L42-L47)

## Risk map

These are source observations and explicitly labeled hypotheses, not confirmed vulnerabilities. The most consequential boundaries accept executable configuration, launch processes, communicate with drivers, and write caller-selected artifacts. Credential transport and logging depend on protocol and masking choices. Testing configuration and browser compatibility branches also create limits on what source inspection alone can establish.
- Configuration and plugins are executable inputs: ConfigParser imports the selected config module, initializePlugin imports scoped/absolute or convention-derived modules, and automationProtocol can select a dynamically imported driver. — [packages/wdio-config/src/node/ConfigParser.ts#L136-L145](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-config/src/node/ConfigParser.ts#L136-L145) [packages/wdio-config/src/node/FileSystemPathService.ts#L19-L23](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-config/src/node/FileSystemPathService.ts#L19-L23) [packages/wdio-utils/src/initializePlugin.ts#L15-L45](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-utils/src/initializePlugin.ts#L15-L45) [packages/webdriverio/src/utils/driver.ts#L28-L40](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/driver.ts#L28-L40)
- Process-launch boundaries inherit environment settings and accept runtime arguments; Chromium startup can download/select a driver binary, defaults allowedOrigins to '*' and allowedIps to '0.0.0.0', and accepts spawnOpts overrides. — [packages/wdio-local-runner/src/worker.ts#L123-L165](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-local-runner/src/worker.ts#L123-L165) [packages/wdio-utils/src/node/startWebDriver.ts#L145-L158](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-utils/src/node/startWebDriver.ts#L145-L158)
- BiDi connection options follow up to ten redirects and forward custom headers; strictSSL=false disables certificate verification. The source explicitly identifies cross-host credential forwarding as a consequence of misconfigured redirects. — [packages/webdriver/src/utils.ts#L459-L479](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/utils.ts#L459-L479)
- HTTP session authentication uses a Basic header on /session. LambdaTest auto-detection defaults to HTTP port 80 unless overridden, and enabled Appium direct connection replaces host/protocol/path/port from returned capabilities. — [packages/webdriver/src/request/request.ts#L136-L146](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/request/request.ts#L136-L146) [packages/webdriverio/src/utils/detectBackend.ts#L99-L105](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/detectBackend.ts#L99-L105) [packages/webdriver/src/index.ts#L89-L98](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/index.ts#L89-L98) [packages/webdriver/src/utils.ts#L383-L397](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/utils.ts#L383-L397)
- Input masking covers selected request/log payloads, but command result values are logged; the e2e masked-input example explicitly warns that a later getValue exposes the password in logs. — [packages/webdriver/src/command.ts#L137-L168](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/command.ts#L137-L168) [packages/webdriver/src/command.ts#L175-L188](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/command.ts#L175-L188) [e2e/wdio/headless/test.e2e.ts#L51-L59](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/e2e/wdio/headless/test.e2e.ts#L51-L59)
- Screenshot writes resolve caller paths without a repository-root constraint. BrowserRunner.initialize recursively removes an existing configured reports directory when clean is absent or true, so artifact configuration controls filesystem effects. — [packages/webdriverio/src/node/saveScreenshot.ts#L43-L55](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L43-L55) [packages/wdio-browser-runner/src/index.ts#L49-L50](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-browser-runner/src/index.ts#L49-L50) [packages/wdio-browser-runner/src/index.ts#L70-L77](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-browser-runner/src/index.ts#L70-L77)
- Shared-store routes bind to loopback and expose get/set/pool operations without authentication middleware in the inspected chain. validateBody checks only paths ending /get or /set, while the primary setter is POST /; this mismatch warrants investigation, not a confirmed exploit claim. — [packages/wdio-shared-store-service/src/server.ts#L15-L44](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/server.ts#L15-L44) [packages/wdio-shared-store-service/src/server.ts#L115-L121](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-shared-store-service/src/server.ts#L115-L121)
- Hypothesis: compatibility regressions may escape narrow mocked checks because locator behavior combines protocol fallbacks, browser-version workarounds, shadow-root state, and stale-element recovery, while unit configuration suppresses unhandled-error and default coverage signals. (inferred) — [packages/webdriverio/src/utils/index.ts#L494-L521](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/index.ts#L494-L521) [packages/webdriverio/src/utils/index.ts#L577-L668](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/index.ts#L577-L668) [packages/webdriverio/src/middlewares.ts#L43-L73](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/middlewares.ts#L43-L73) [vitest.config.ts#L5-L9](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L5-L9) [vitest.config.ts#L23-L32](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L23-L32)

## Extension points

Extension is built into both user configuration and package internals. Name-based plugin loading supports official and community packages, while service activation distinguishes launcher and worker responsibilities. Command barrels and protocol descriptor tables construct client APIs. Custom locators, framework adapters, reporters, automation drivers, and compiler plugins provide additional integration seams.
- initializePlugin resolves scoped or absolute imports first, then @wdio/<name>-<type>, then wdio-<name>-<type>, and throws an actionable error when no candidate loads. — [packages/wdio-utils/src/initializePlugin.ts#L15-L51](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-utils/src/initializePlugin.ts#L15-L51)
- Services accept existing hook objects, classes, or package names; package launcher exports run in the parent, and shouldLoad(config, caps) can prevent a package from being imported into workers. — [packages/wdio-utils/src/initializeServices.ts#L23-L69](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-utils/src/initializeServices.ts#L23-L69) [packages/wdio-utils/src/initializeServices.ts#L121-L157](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-utils/src/initializeServices.ts#L121-L157)
- Browser and element commands enter their scopes through export barrels; applyScopePrototype enumerates those exports and excludes names listed in IGNORED_COMMAND_FILE_EXPORTS. — [packages/webdriverio/src/commands/browser.ts#L1-L44](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/browser.ts#L1-L44) [packages/webdriverio/src/commands/element.ts#L1-L20](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/commands/element.ts#L1-L20) [packages/webdriverio/src/utils/index.ts#L31-L42](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/index.ts#L31-L42)
- addCommand and overwriteCommand are propagated across multiremote instances; runner session replacement also preserves custom and overwritten commands registered against the preliminary stub. — [packages/webdriverio/src/index.ts#L182-L213](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/index.ts#L182-L213) [packages/wdio-runner/src/index.ts#L373-L400](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L373-L400)
- addLocatorStrategyHandler stores named functions in a strategies Map, rejects duplicate names, and propagates registrations to multiremote constituent instances. — [packages/webdriverio/src/utils/index.ts#L1086-L1105](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/index.ts#L1086-L1105)
- automationProtocol selects the Driver factory or protocol stub; protocol getPrototype converts endpoint/method descriptor entries into command functions rather than hand-writing each HTTP method. — [packages/webdriverio/src/utils/driver.ts#L19-L40](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/driver.ts#L19-L40) [packages/webdriver/src/utils.ts#L337-L343](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/src/utils.ts#L337-L343) [packages/wdio-protocols/src/protocols/webdriver.ts#L953-L965](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-protocols/src/protocols/webdriver.ts#L953-L965)
- Local framework adapters load through initializePlugin(config.framework, 'framework') and expose init/run behavior; reporter configuration accepts custom classes or tuples with options and supports asynchronous synchronization. — [packages/wdio-runner/src/index.ts#L280-L289](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L280-L289) [packages/wdio-runner/src/index.ts#L240-L246](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L240-L246) [packages/wdio-runner/src/reporter.ts#L174-L198](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/reporter.ts#L174-L198) [packages/wdio-runner/src/reporter.ts#L204-L235](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/reporter.ts#L204-L235)
- The compiler has package-specific esbuild plugin tables, including protocol type generation, create-wdio template copying, and webdriverio external scripts; BiDi generation derives TypeScript definitions and command methods from CDDL. — [infra/compiler/src/index.ts#L58-L80](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/infra/compiler/src/index.ts#L58-L80) [scripts/bidi/index.ts#L33-L50](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/scripts/bidi/index.ts#L33-L50) [scripts/bidi/index.ts#L61-L109](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/scripts/bidi/index.ts#L61-L109)

## Contributor handoff

Begin with the owning package and the smallest relevant lifecycle chain; the inventory and investigation are bounded. Tests and CI were inspected, not executed, and no passing status is asserted. Preserve the distinctions between Node/browser exports, launcher/worker hooks, stub/real sessions, and Classic/BiDi behavior. Proposed validation should remain read-only here and become executable only under appropriate task authorization.
- Use package.json and pnpm-workspace.yaml as the dependency/build authority; tsconfig selects strict NodeNext/ES2022 compilation, and public webdriverio exports require awareness of Node, browser, ESM, and CommonJS surfaces. — [package.json#L1-L5](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/package.json#L1-L5) [pnpm-workspace.yaml#L1-L17](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/pnpm-workspace.yaml#L1-L17) [tsconfig.json#L2-L21](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/tsconfig.json#L2-L21) [packages/webdriverio/package.json#L46-L64](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/package.json#L46-L64)
- For CLI lifecycle changes, read commands/run.ts, Launcher.run/_runSpecs/_endHandler, and Runner.run first; preserve hook order and the retry-budget message sent before requesting a real session. — [packages/wdio-cli/src/commands/run.ts#L193-L268](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/commands/run.ts#L193-L268) [packages/wdio-cli/src/launcher.ts#L103-L149](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L103-L149) [packages/wdio-cli/src/launcher.ts#L647-L680](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/src/launcher.ts#L647-L680) [packages/wdio-runner/src/index.ts#L145-L158](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-runner/src/index.ts#L145-L158)
- For element behavior, keep changes within the command and relevant lookup/middleware chain; selector, parent, elementId, and BiDi locator fields are functional recovery state rather than incidental metadata. — [packages/webdriverio/src/utils/getElementObject.ts#L66-L101](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/getElementObject.ts#L66-L101) [packages/webdriverio/src/middlewares.ts#L23-L73](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/middlewares.ts#L23-L73)
- Treat Classic and BiDi as explicit branches: findElement excludes iframe/deep-selector cases from its BiDi path, and screenshot options are rejected in Classic but validated and supported in BiDi. — [packages/webdriverio/src/utils/index.ts#L828-L854](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/utils/index.ts#L828-L854) [packages/webdriverio/src/node/saveScreenshot.ts#L64-L109](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/src/node/saveScreenshot.ts#L64-L109)
- Do not interpret root build/setup as passive checks: scripts clean artifacts and generate BiDi sources, whose generator can download specification input and overwrite generated TypeScript files. — [package.json#L9-L29](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/package.json#L9-L29) [scripts/bidi/index.ts#L22-L50](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/scripts/bidi/index.ts#L22-L50)
- If execution is later authorized, select the owning test through the configured Vitest runner first; relevant inspected examples include request.test.ts, launcher.test.ts, and node/saveScreenshot.test.ts. Broader typing, smoke, component, and e2e scripts have distinct prerequisites. — [package.json#L42-L61](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/package.json#L42-L61) [vitest.config.ts#L6-L19](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L6-L19) [packages/webdriver/tests/request.test.ts#L1-L24](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriver/tests/request.test.ts#L1-L24) [packages/wdio-cli/tests/launcher.test.ts#L1-L25](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/wdio-cli/tests/launcher.test.ts#L1-L25) [packages/webdriverio/tests/node/saveScreenshot.test.ts#L1-L33](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/packages/webdriverio/tests/node/saveScreenshot.test.ts#L1-L33)
- Tests and CI were inspected, not executed: carry forward the limitations that driver setup is skipped in unit tests, coverage is disabled by default, Preact/misc component commands are bypassed, and cloud CI is main-only. — [vitest.config.ts#L17-L32](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/vitest.config.ts#L17-L32) [e2e/package.json#L11-L13](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/e2e/package.json#L11-L13) [e2e/package.json#L29-L29](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/e2e/package.json#L29-L29) [.github/workflows/test.yml#L146-L151](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/test.yml#L146-L151)
- Keep publication and deployment outside ordinary edits: npm publishing is manually dispatched and depends on publisher-team authorization, whereas documentation deployment is a separate manually dispatched workflow with cloud credential references. — [.github/workflows/publish.yml#L3-L34](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/publish.yml#L3-L34) [.github/workflows/authorize-publisher.yml#L13-L19](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/authorize-publisher.yml#L13-L19) [.github/workflows/deploy.yml#L5-L28](https://github.com/webdriverio/webdriverio/blob/dbf0f497130676040ce4212d9cf6459adfe16c42/.github/workflows/deploy.yml#L5-L28)

Source repository: https://github.com/webdriverio/webdriverio
Full evidence corpus: https://github.com/Codevetter/codevetter/tree/main/benchmarks/repo-unpacks/webdriverio.json

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
