One framework to test every platform your users are on
Browsers, native and hybrid mobile apps, desktop apps, VS Code extensions and visual regressions, all with one API. Built on web standards, openly governed, and ready for your coding agent.
npm init wdio@latest .Sponsored byand
Write it once. Run it on every platform.
The same test runner, selectors, assertions and reporters, whether you are testing a web app, a phone, a desktop app or an editor extension.
End-to-end and component tests in real browsers
- Chrome, Firefox, Safari and Edge through WebDriver and WebDriver BiDi
- Component tests for React, Vue, Svelte, Solid, Preact, Lit and Stencil
- Network mocking, emulation and auto-waiting built in
import { browser, $, expect } from '@wdio/globals'
describe('webdriver.io', () => {
it('finds the docs search', async () => {
await browser.url('https://webdriver.io')
await $('.DocSearch-Button').click()
await expect($('.DocSearch-Modal')).toBeDisplayed()
})
})
How agents verify their own work.
A software factory runs on verification loops. wdio session is how an agent runs that loop on the real app: it opens a browser, a phone, or a desktop app, sees what is there, acts on it, and checks the result. What passed becomes a test.
A looping demo of wdio session. It opens Chrome on a shop, snapshots the Add to cart button, clicks it, passes a visual check, repeats that on Android and Electron, then exports one test for all three.
Write the intent. Replay the code.
Describe a step in plain words and your own model performs it once. WebdriverIO records the commands it ran, replays them on every later run without a model, and heals them when your UI changes, but only when the healed step does what the recorded one did, checked over WebDriver BiDi.
A looping demo of browser.act(). The model adds a blue T-shirt to the cart once and two WebdriverIO commands are recorded with the request the click sent. The next run replays them with no model calls. After a refactor renames a test id, the step heals without the model, sends the same request, and saves screenshots and a video. Eject turns the act() call into the two commands.
A refactor renamed the test id. The step heals without the model, only after it sends the same request, and leaves screenshots and a video to review.
act() and extract()
Perform a step from a sentence, or read typed data from the page and the API responses behind it.
Zero tokens when green
Recorded steps live next to the spec and replay like hand-written commands.
Heals you can trust
A healed step has to send the same requests and change the same parts of the page, or the test fails.
Your model, no lock-in
Anthropic, OpenAI, OpenRouter or a local model through Ollama. Eject to plain code any time.
Built for coding agents
Most tests are now written together with an agent. WebdriverIO gives it everything it needs to write, run and fix them on its own.
wdio session
Let agents drive any app from the shell and turn the session into a test.
WebdriverIO MCP
Let agents drive browsers and mobile apps to explore your UI and find robust selectors.
Agent-ready docs
Every page as Markdown, llms.txt, per-section bundles and a docs MCP server at webdriver.io/mcp.
Traces agents can read
Failing tests leave a Markdown transcript, screenshots and accessibility snapshots behind.
Write a login test for localhost:3000 and make sure it passes.
webdriverio-docssearch_docs"selectors best practices"
wdio-mcpstart_session{ platform: "browser", browser: "chrome" }
wdio-mcpnavigate"http://localhost:3000/login"
wdio-mcpget_elements{ }
Found the form. Writing test/specs/login.e2e.ts with aria selectors.
terminalnpx wdio runwdio.conf.ts --spec test/specs/login.e2e.ts
✓ 1 passing (2.4s)
The dashboard that opens while your tests run. Commands, the page, and source update as each step executes.
See exactly what your test did
WebdriverIO DevTools shows every command, network request, console message and screenshot of a run. Watch tests live and rerun single tests with a click, or record portable traces in CI and replay them later.
Community driven. Openly governed.
WebdriverIO is not a product of a testing company. It is run by its community under the umbrella of the OpenJS Foundation, so its direction follows the needs of its users.
OpenJS Foundation
Owned by a vendor-neutral non-profit, next to Node.js, Electron and webpack.
Open governance
A public governance model: anyone can contribute, and committers and the TSC grow out of the community.
Every feature is free
No paid tier, no feature gates, no lock-in to a cloud vendor. Run anywhere.
Paid contributors
Sponsorship money flows back to contributors through the stipend program.
We’d like to extend our heartfelt thanks to all the contributors who have helped make WebdriverIO the powerful tool it is today. Your dedication and effort are truly appreciated!
Real browsers, real devices, real users
WebdriverIO automates through WebDriver and WebDriver BiDi, the W3C standards every browser vendor ships. No patched browser builds and no JavaScript-emulated clicks: your tests interact with your app the way your users do.
Sponsored by companies that care
We are an open source project with a strong commitment to transparency and community governance. We are part of the OpenJS Foundation which is a part of the Linux Foundation. The project is entirely run by volunteers and funded by invested companies that want to see the project succeed. The project team is grateful for the generous sponsorship of these companies.
Premium Sponsors
Gold Sponsors
If you use WebdriverIO within your organization, please consider supporting the project by becoming a sponsor. It will help us to keep the project running and evolving.
Start testing in under a minute
npm init wdio@latest .


















