Picking a browser test framework is one of the stickier decisions a team makes, because switching later means rewriting every spec file and retraining whoever owns the CI pipeline. Most teams asking "Playwright or Cypress" are really asking which one they will still be running in three years.
By the last week of September 2026, the playwright-core package on npm was pulling more than 122 million downloads a week, more than Cypress, Selenium and WebdriverIO combined, while LambdaTest had already spent the year rebranding itself TestMu AI. Here is what actually runs each framework, what it costs to run it in CI at scale, and which one to pick without migrating twice.
What Teams Actually Run
This is not the AI-agent testing category. If you want QA Wolf, Applitools, mabl, Momentic or an agent that explores your app and writes its own tests, that comparison lives in our guide to AI QA and autonomous testing tools. This post is about the scripted frameworks a human still writes assertions for: Playwright, Cypress, Selenium and WebdriverIO.
Two frameworks from the previous decade are effectively gone. The Angular team deprecated Protractor on August 31, 2023, after announcing the move a year earlier, and archived its GitHub repository on July 29, 2024. TestCafe is not dead, its GitHub repo took a push as recently as September 10, 2026 and its latest release, v3.7.6, shipped July 7, 2026, but DevExpress has stepped back from active development and new projects rarely pick it up. What replaced them is a three-way split between a Microsoft-backed newcomer, a JavaScript-only incumbent, and a two-decade-old protocol that refuses to die: as of September 28, 2026, Playwright carries 96,811 GitHub stars against Cypress's 51,034 and Selenium's 34,514, with WebdriverIO a distant fourth at 9,843. Stars measure attention, not usage, but the npm download gap in the next section tells the same story with money-adjacent numbers.
Comparing Them With One Script
Vendor comparison pages round their own stars up and everyone else's down. The fix is asking GitHub and npm directly:
JavaScriptconst REPOS = { Playwright: "microsoft/playwright", Cypress: "cypress-io/cypress", Selenium: "SeleniumHQ/selenium", WebdriverIO: "webdriverio/webdriverio", } const NPM_PACKAGES = { Playwright: "playwright-core", Cypress: "cypress", Selenium: "selenium-webdriver", WebdriverIO: "webdriverio", } async function main() { const rows = [] for (const name of Object.keys(REPOS)) { const repo = REPOS[name] const pkg = NPM_PACKAGES[name] const [repoRes, relRes, dlRes] = await Promise.all([ fetch(`https://api.github.com/repos/${repo}`), fetch(`https://api.github.com/repos/${repo}/releases/latest`), fetch(`https://api.npmjs.org/downloads/point/last-week/${pkg}`), ]) const repoData = await repoRes.json() const relData = await relRes.json() const dlData = await dlRes.json() rows.push({ name, stars: repoData.stargazers_count, license: repoData.license?.spdx_id, version: relData.tag_name, published: relData.published_at?.slice(0, 10), weeklyDownloads: dlData.downloads, }) } console.table(rows) } main()
Running it on September 27, 2026 produced this:
┌─────────┬───────────────┬───────┬──────────────┬───────────────────┬──────────────┬─────────────────┐
│ (index) │ name │ stars │ license │ version │ published │ weeklyDownloads │
├─────────┼───────────────┼───────┼──────────────┼───────────────────┼──────────────┼─────────────────┤
│ 0 │ 'Playwright' │ 96811 │ 'Apache-2.0' │ 'v1.63.0' │ '2026-09-04' │ 122713314 │
│ 1 │ 'Cypress' │ 51034 │ 'MIT' │ 'v16.1.0' │ '2026-09-15' │ 7097782 │
│ 2 │ 'Selenium' │ 34514 │ 'Apache-2.0' │ 'selenium-4.49.0' │ '2026-09-09' │ 2260853 │
│ 3 │ 'WebdriverIO' │ 9843 │ 'MIT' │ 'v9.32.0' │ '2026-09-20' │ 3214599 │
└─────────┴───────────────┴───────┴──────────────┴───────────────────┴──────────────┴─────────────────┘
The npm figure for Playwright counts every CI job that reinstalls it on every run, so treat it as a lower bound on how often the package gets pulled, not a headcount of developers. Point the script at any other pair of packages and it works the same way; nothing here depends on our numbers being current by the time you read this.
Playwright
Playwright is Microsoft's browser automation library, one API driving Chromium, Firefox and WebKit from TypeScript, JavaScript, Python, .NET or Java. Its homepage now leads with "testing, scripting, and AI agents," reflecting the newer Playwright MCP server that gives coding agents structured browser control through accessibility snapshots rather than screenshots.

It does auto-waiting and retry-ability by default, so a test does not need a manual sleep before clicking a button that has not rendered yet. The trace viewer records a full timeline, network log and DOM snapshot for every failed run, and the built-in test runner parallelizes across workers without extra tooling. What it does not do is ship its own hosted results dashboard the way Cypress does, and its WebKit build is not the actual Safari binary Apple ships, so a small class of real-Safari bugs still needs a real device to catch. Apache 2.0, 96,811 stars, v1.63.0 as of September 4, 2026. Microsoft's own cloud offering, renamed Playwright Workspaces under the new Azure App Testing umbrella, bills by the test-minute rather than by seat; Azure's calculator did not surface a per-minute rate for every region at the time we checked, so get a quote for yours before assuming a number.
Cypress
Cypress runs its own test code directly inside the browser's event loop instead of driving it over a remote protocol, which is why its debugger can time-travel through every command with a DOM snapshot at each step. Its current homepage pitch, "AI writes the code, Cypress proves it works," points at Cypress Studio: AI-assisted test authoring built into the paid Cypress App.

It does automatic retries, real-time reload on save, and flake detection once you're on Cypress Cloud. What it does not do: because it runs inside the browser's own tab, it has no native way to control two browser tabs or origins at once without workarounds, and it has never supported Safari or real mobile browsers, Chromium-family and Firefox only. MIT, 51,034 stars, v16.1.0 as of September 15, 2026. Cypress Cloud has a free Starter tier (10 users, 500 test results a month), Team at $67 a month billed $799 a year, Business at $267 a month billed $3,199 a year, and custom Enterprise pricing, verified on cypress.io's own pricing page.
Selenium
Selenium is the project that made "automate the browser" a category in the first place, and it now governs the W3C WebDriver and WebDriver BiDi standards that Cypress, Playwright and WebdriverIO all either implement or work alongside. The Software Freedom Conservancy holds the project, not a company, and its homepage still describes the whole thing in one line: "Selenium automates browsers. That's it!"

Selenium Grid distributes runs across machines you control, and because WebDriver talks to the browser vendor's own driver (geckodriver for Firefox, safaridriver for actual Safari), it gets real-browser fidelity nothing else here matches. What it does not do is wait for you: there is no built-in auto-waiting or retry-ability, so untuned Selenium suites are the flakiest of the four, and there is no trace viewer or time-travel debugger bundled in. Apache 2.0, 34,514 stars, 4.49.0 as of September 9, 2026. Selenium itself sells nothing, so running it in CI at any real scale means either hosting Grid yourself or paying a cloud vendor, which is the whole subject of the next section.
WebdriverIO
WebdriverIO is an OpenJS Foundation project, the same governance model as Node.js itself, that wraps the WebDriver and WebDriver BiDi protocols in an API with Playwright-like ergonomics: auto-waiting, a service and reporter plugin architecture, and first-class Appium support for real mobile devices out of the box.

Because it speaks the same protocol as Selenium, it gets the same real-Safari and real-Firefox fidelity, without Selenium's bare-metal API. What it does not do is match the other three on community size: fewer Stack Overflow answers, fewer blog posts, and noticeably shakier autocomplete from AI coding assistants that were trained on far less WebdriverIO code than Playwright or Cypress code. MIT, 9,843 stars, v9.32.0 as of September 20, 2026. Like Selenium, it has no first-party managed cloud.
What the Cloud Grid Layer Actually Costs
All four frameworks are free. What is not free is running them against real devices and every browser combination in CI, and that market moved this year. LambdaTest rebranded to TestMu AI on January 12, 2026, and its pricing page now defaults to KaneAI, its AI test-authoring agent, at $17 a month for the Starter tier (2,000 credits per agent monthly), $89 for Pro, and $179 for the "Most Popular" Max tier, all billed annually, verified on testmuai.com on September 28, 2026. BrowserStack's Live plan, its manual cross-browser tier, runs $150 a month for a five-user team billed annually, with a 15-product "Team Ultimate" AI bundle at $375 a month, verified on browserstack.com the same day. Sauce Labs prices Live Testing at $39 a month, its Virtual Device Cloud at $149, and its Real Device Cloud at $199, all billed annually, and its own pricing page was, at the time we looked, promoting a new AI code-verification product called AURA.
Side by Side
| Tool | Model | Entry price (cloud grid) | Real Safari | License |
|---|---|---|---|---|
| Playwright | Test-minute (Azure App Testing) | Quote-only, region-gated | No (bundled WebKit) | Apache 2.0 |
| Cypress | Per seat + result volume | $67/mo (Team, Cypress Cloud) | No (unsupported) | MIT |
| Selenium | Third-party grid or self-host | $39/mo (Sauce Labs Live) | Yes (safaridriver) | Apache 2.0 |
| WebdriverIO | Third-party grid or self-host | $39/mo (Sauce Labs Live) | Yes (safaridriver) | MIT |
How to Choose Without Migrating Twice
Count how many origins a single test needs to cross. If a checkout flow bounces through a third-party payment page and back, Cypress's single-origin model fights you; Playwright and WebdriverIO handle it natively.
Check whether real Safari matters to your users. A consumer product with meaningful iOS Safari traffic needs WebDriver's real-browser fidelity, which means Selenium or WebdriverIO, or a cloud grid's real-device farm layered on top of Playwright or Cypress.
Run the comparison script above against your own shortlist. Stars and downloads move month to month; rerun it before you commit rather than trusting a screenshot from a blog post, including this one.
Price the cloud grid against your actual parallel-run count, not the entry tier. A five-person team fits BrowserStack's or Sauce Labs' cheapest plan; a CI pipeline running 40 parallel jobs on every pull request does not, and every vendor here gates real throughput behind a higher tier or a sales call.
Weight community size if you lean on AI coding assistants. WebdriverIO's smaller footprint in public code means noticeably weaker autocomplete and chat suggestions for it today than for Playwright or Cypress.
Which One Should You Actually Use?
Starting a new project with no legacy suite: Playwright. The download numbers above are not a fluke, and the MCP server is a real head start if any part of your test-writing workflow already involves a coding agent.
Already deep in a Cypress suite with a happy team: stay put. Cypress's time-travel debugger is still the best day-to-day authoring experience of the four, and a full rewrite rarely pays for itself unless you specifically need multi-origin or multi-tab tests.
Real Safari and real mobile devices matter to the business: Selenium or WebdriverIO on top of a cloud grid, not Playwright's bundled WebKit. Pick WebdriverIO if you want Playwright-style ergonomics with WebDriver's fidelity; pick Selenium if your team already has deep Selenium Grid operational knowledge.
No budget for a cloud grid at all: self-hosted Selenium Grid or WebdriverIO against your own device lab. It is more ops work, but it is the only entry in this post with a real $0 option for cross-browser coverage.
Conclusion
The framework decision mostly already happened: Playwright's download lead over the other three combined is not close, and a team starting today with no legacy suite has little reason to pick anything else. What is still moving is the cloud layer underneath it: LambdaTest's rebrand to TestMu AI, Sauce Labs' new AURA product, and Microsoft's rename of its Playwright cloud into Azure App Testing all landed within twelve months. Before renewing any cloud-grid contract, ask what your actual parallel-run count is this quarter, not what it was when you signed, since every vendor here prices the difference.
Related DevToolLab Tools
- Cypress Config Generator - build a
cypress.config.tsfor E2E or component testing without memorizing thedevServerandspecPatternshape. - Playwright Config Generator - generate
playwright.config.tswith a project entry per browser and CI-friendly retries and reporters. - Vitest Config Generator - configure the unit-test layer that should sit underneath any of these E2E suites, not replace it.
- User Agent Parser - decode the user agent string a flaky cross-browser failure actually ran under before assuming it is the framework's fault.
Related Guides
- Best AI QA and Autonomous Testing Tools - the AI-agent-driven category this post deliberately excludes: QA Wolf, Applitools, mabl and Momentic.
- Best Load Testing Tools - once functional E2E tests pass, load testing answers whether the app survives real traffic.
- Best API Testing Tools - for testing below the browser layer, where a UI test is the wrong and slower tool.
- Best CI/CD Tools - what actually runs these test suites on every pull request, and what that costs on top of the cloud grid above.
