Choosing a Tool
|
This content was generated with the assistance of AI and should be verified against the official documentation before being relied on in production. The reference material consulted while preparing these pages is listed in the section bibliography. |
There is no best browser test tool, only the best fit for a team, a language and a set of constraints. This page puts the three tools of this section side by side, gives a flowchart for the first decision, surveys the adjacent tools that the page this section replaces mentioned, points to the official migration guides and explains why a browser E2E suite is not a load test. Comparison facts were checked on 25 October 2026 against the baseline of the section home page: Playwright 1.64, Cypress 16.2 and Selenium 4.51. Each row links to the page that teaches the topic.
The comparison
| Aspect | Selenium 4.51 | Playwright 1.64 | Cypress 16.2 |
|---|---|---|---|
Languages |
Java, Python, C#, Ruby, JavaScript and Kotlin (Kotlin uses the Java binding on the JVM). |
JavaScript and TypeScript (with the built-in test runner), Python, Java and .NET. |
JavaScript and TypeScript only; tests run in the browser. |
Browsers and engines |
Every browser that has a WebDriver driver: Chrome, Edge, Firefox, Safari and older versions; a real installed browser. |
Chromium, Firefox and WebKit builds that Playwright ships, plus branded Chrome and Edge through channels. |
Chrome family, Edge, Firefox and Electron; WebKit support is experimental. |
Execution model |
Out of process: client, driver, browser; WebDriver Classic over HTTP, BiDi over WebSocket. See How Browser Automation Works. |
Out of process: client, Node.js driver, patched browser builds; one socket. |
In the browser, in the app’s run loop, plus a Node.js process. |
Auto-waiting |
Not automatic: you add implicit, explicit or fluent waits (Waits & Expected Conditions). |
Built in: actions wait for actionability and web-first assertions retry (Locators, Actions & Auto-Waiting). |
Built in: queries and assertions retry, actions check actionability (Core Concepts). |
Multiple tabs and windows |
Native: window handles. |
Native: several pages and contexts in a test. |
One browser at a time; tabs are limited by design (a plugin can help). |
Multiple origins |
Unrestricted. |
Unrestricted. |
|
Iframes |
|
Frame locators work across origins. |
Same-origin frames can be queried; no "switch into a frame" command yet. |
Mobile emulation |
Browser options, such as Chrome’s device metrics; real devices through Appium or a cloud provider. |
Built-in device descriptors for viewport, user agent, touch and locale; Android is experimental. |
Viewport and user-agent settings only. |
Parallelism and grid |
Selenium Grid (standalone, hub and nodes, or fully distributed) and docker-selenium (Selenium Grid). |
Workers on one machine, sharding across machines with merged reports (Parallelism, Sharding & Retries). |
Parallelisation and load balancing through Cypress Cloud, or manual splitting of specs across CI jobs (Cypress Cloud). |
Evidence and debugging |
Screenshots through the API; video, logs and replay come from Grid add-ons, IDEs or vendors. |
Screenshots, video and the trace viewer with DOM snapshots, network and console; UI Mode and Inspector (Screenshots, Videos & Traces). |
Time-travel snapshots in the app, automatic screenshots and video on |
Visual testing |
No built-in comparison; third-party services and libraries (Visual Regression Testing). |
|
No built-in comparison; plugins and services; UI Coverage is a separate premium product. |
Component testing |
Not a goal. |
Built-in |
Built-in for React, Angular, Vue and Svelte. |
AI features |
Documentation page on using AI agents with Selenium. |
Playwright MCP and CLI, Playwright Test Agents (planner, generator, healer). |
|
Licence and cost |
Open source (Apache 2.0); no paid component of its own; cloud grids and Grid hosting are your choice. |
Open source (Apache 2.0); Playwright Workspaces in Azure App Testing is the optional Microsoft cloud service. |
The Cypress App is free and open source; Cypress Cloud, UI Coverage and Accessibility are paid services, and plan limits change, so check the vendor’s pricing page. |
Community and maturity |
Oldest and largest; the de facto standard for over a decade; many existing suites. |
Younger; first-party documentation and release cadence are strong; often the default for new projects. |
Mature and JavaScript focused; strong authoring experience. |
Two cautions apply to every comparison table, including this one. First, the cells are a snapshot: Cypress 16 and
Playwright 1.64 both changed within the last two months, and the older pages of vendor blogs describe neither
accurately. Second, "supports" is not "equal": Selenium drives Safari through safaridriver and Playwright drives WebKit
through its own build, which is close to Safari but is not Safari.
Deciding
The flowchart is a starting point, not a verdict. Three questions settle most real choices:
-
Which language do the tests have to be written in? A team of Java developers whose build already runs JUnit gets value from Selenium or Playwright for Java immediately. Cypress rules itself out.
-
Which engines must pass? If real Safari or an old browser matters, Selenium is the only one that drives them. If WebKit and Firefox coverage on Linux CI is enough, Playwright’s bundled builds are simpler to run.
-
What will maintain the suite? Auto-waiting, tracing and a good authoring loop reduce maintenance. All three tools have them now; Selenium needs more of them assembled by the team.
Other options
Tools outside this section’s three that the earlier page already surveyed, with the points that matter when comparing:
-
Puppeteer is Google’s Node.js library for Chrome and, through WebDriver BiDi, Firefox. It is a library, not a test framework: there is no runner, assertions or auto-waiting tests bundle, so you combine it with Jest or Mocha. It is well suited to scraping, PDF and screenshot generation and to custom tooling.
-
WebdriverIO is a JavaScript test framework built on WebDriver and WebDriver BiDi, with its own runner, services for Selenium Grid and cloud providers, and a visual testing service. The visual service’s current major version requires WebdriverIO’s matching major, so check the compatibility note before installing.
-
TestCafe needs no driver: it injects a script into the page and proxies traffic, so it works with any installed browser. It is a JavaScript and TypeScript tool with its own runner.
-
Robot Framework Browser exposes Playwright through Robot Framework’s keyword syntax, which suits teams with testers who do not write code. It is the Playwright engine under keywords.
-
Selenide is a Java wrapper around Selenium with fluent assertions, automatic waits and screenshots on failure, aimed at teams who want Selenium’s browser reach with Playwright-like ergonomics.
-
Nightwatch is a Node.js end-to-end framework built on WebDriver, with a runner, a CSS and XPath-based API and a bundled assertion library; it also supports component testing.
For native and cross-platform mobile apps use Appium, Detox or Maestro; the React Native testing page compares them. Protractor, the Angular team’s former WebDriver wrapper, reached end of life in 2023; it is part of the history covered by the migration guides below.
Source: Puppeteer, WebdriverIO, TestCafe, Robot Framework Browser, Selenide, Nightwatch
The tools above were not installed or run for this page. Their descriptions come from their own sites and are kept short on purpose; check each project’s documentation for the current state before committing to one.
Migration guides
Each tool publishes a guide for people arriving from another:
-
Migrate from Selenium to Cypress: syntax mappings for locators, waits and page objects, with a ready-made prompt for an AI coding assistant.
-
Migrate from Protractor to Cypress: the equivalent for Angular teams.
-
Migrate from Playwright to Cypress: locator, assertion and network mocking mappings.
-
Playwright: Migrating from Protractor: a cheat sheet mapping
element(by.css(...))to Playwright locators,waitForAngularto auto-waiting, and theawaitdiscipline.
The guides cover syntax; the architectural differences in How Browser Automation Works — the Cypress single-browser model, Selenium’s explicit waits — decide how much of a suite can be translated mechanically and how much has to be redesigned. Whichever way the migration goes, move the suite in slices: run old and new side by side in CI until the new one covers the same journeys.
Browser E2E is not load testing
A browser test drives one real browser per scenario. It is slow to start, heavy in memory and measures what one user sees in one browser. A load test must generate thousands of concurrent users with realistic protocol-level traffic, and measure throughput, latency percentiles and error rates on the server. Spawning hundreds of browsers to do that wastes the resources and the measurement is dominated by the load generator’s own limits. Selenium’s documentation lists performance testing among its discouraged uses, and Cypress’s trade-offs page names it as something Cypress is not the optimal tool for.
Use the right tool for each question: a browser tool to prove that a journey works and renders, and a load tool such as Apache JMeter to prove that the system keeps working under traffic. The JMeter section covers recording real traffic, assertions and analysing bottlenecks. A useful compromise is to run one browser journey while a load test hammers the back end, to see what a user would experience at that moment.
What changed recently
| Date | Change |
|---|---|
September 2026 |
Cypress 16 removed |
October 2026 |
Selenium 4.51 shipped on 9 October for every binding. Playwright 1.64 added WebMCP support and |
2026 |
Playwright 1.62 replaced the experimental component-testing packages with a built-in |
2026 |
The W3C WebDriver BiDi specification reached a Working Draft of 8 October. |