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.

cy.origin() for cross-origin steps; one superdomain per test otherwise.

Iframes

switchTo().frame(), including cross-origin frames.

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 cypress run, Test Replay in Cypress Cloud.

Visual testing

No built-in comparison; third-party services and libraries (Visual Regression Testing).

toHaveScreenshot() with baselines, masks and thresholds.

No built-in comparison; plugins and services; UI Coverage is a separate premium product.

Component testing

Not a goal.

Built-in mount model since 1.62 (the earlier experimental packages are retired).

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).

cy.prompt, Studio AI, AI skills and the read-only Cloud MCP (AI Features in Cypress & Selenium).

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

flowchart TD A["New browser E2E suite"] --> B{"Existing suite or infrastructure?"} B -->|"Large Selenium suite or Grid"| S1["Stay on Selenium, adopt BiDi and Selenium Manager"] B -->|"No"| C{"Language of the team?"} C -->|"Java, C#, Python or Ruby, tests must match the app language"| D{"Need real Safari or legacy browsers?"} C -->|"JavaScript or TypeScript"| E{"Need several tabs or cross-origin flows?"} D -->|"Yes"| S2["Selenium"] D -->|"No"| P1["Playwright bindings"] E -->|"Yes, or WebKit and Firefox coverage"| P2["Playwright Test"] E -->|"No, authoring experience matters most"| F{"Component and E2E in one tool?"} F -->|"Yes"| CY["Cypress"] F -->|"No preference"| P2 S1 --> G["Add visual and accessibility checks"] S2 --> G P1 --> G P2 --> G CY --> G

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.

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:

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 Cypress.env(), cy.exec() and cy.end(), moved interception on Chrome-family browsers to the native network path, and dropped Node 20 and 25. Cypress 16.2.0 followed on 13 October with cy.getByRole().

October 2026

Selenium 4.51 shipped on 9 October for every binding. Playwright 1.64 added WebMCP support and page.getByRef().

2026

Playwright 1.62 replaced the experimental component-testing packages with a built-in mount model; Microsoft Playwright Testing was retired on 8 March 2026 in favour of Playwright Workspaces in Azure App Testing.

2026

The W3C WebDriver BiDi specification reached a Working Draft of 8 October.