The CheckOps Engineer home

Essay

Playwright vs Cypress 2026: Which Should You Choose?

Playwright vs Cypress in 2026: architecture, browsers, speed, AI and MCP support, Cypress 16 changes, Playwright 1.58 to 1.64 features and how to choose.

1 January 2026 · 12 min · Irfan Ahmad

Last updated 30 October 2026, with Cypress 16 and Playwright releases up to 1.64.

Playwright and Cypress are the two JavaScript end-to-end testing frameworks most teams shortlist. Both are open source, both have strong communities, and both have changed a lot in 2026. Cypress 16 brought HTTP/2, faster typing and a major security change. Playwright shipped seven minor releases, from 1.58 to 1.64, many of them aimed at AI agents.

This comparison covers architecture, browser support, languages, speed, flakiness tools, AI and MCP support, component testing, pricing and migration, and ends with a decision guide. For the longer history, including Selenium and WebDriver BiDi, see our 2024 comparison.

Playwright vs Cypress at a glance

Playwright Cypress
Maintainer Microsoft Cypress.io
Licence Apache-2.0 MIT
Languages JavaScript/TypeScript, Python, Java, .NET JavaScript/TypeScript
Browsers Chromium, Firefox, WebKit Chrome-family browsers, Firefox, plus experimental WebKit
Architecture Drives browsers from outside the page Runs inside the browser alongside your app
Parallelism Built-in workers and sharding Via Cypress Cloud or third-party tools
Multiple tabs and windows Supported Limited
Agent tooling Playwright MCP, Playwright CLI, Test Agents Cypress AI features in the app and Cloud
GitHub stars (30 Oct 2026) ~98,900 ~51,000
npm weekly downloads (23–29 Oct 2026) ~104 million (@playwright/test) ~8 million (cypress)

Stars and downloads come from the GitHub API and the npm downloads API on 30 October 2026. Downloads include CI installs and agents, so treat them as a rough popularity signal rather than a count of users.

Architecture: the difference that drives everything else

Cypress runs inside the browser. Your test code executes in the same run loop as your application. That gives Cypress its famous developer experience: time-travel debugging, automatic waiting and direct access to the app’s objects. It also explains its historical limits around multiple tabs, multiple origins and non-JavaScript languages. Cypress also proxies every request, which is how cy.intercept() can observe and modify network traffic.

Playwright drives browsers from outside. Tests run in Node.js (or Python, Java, .NET) and control the browser through automation protocols. That makes multiple pages, contexts, origins and browsers straightforward, and it’s why Playwright supports several languages.

Neither model is better in all cases. In-browser execution is excellent for fast feedback on a single app. Out-of-process control is better for complex, multi-context flows.

What changed in Cypress 16

Cypress 16, released on 1 September 2026, focused on speed and security.

Speed improvements

  • HTTP/2 support, on by default in Chromium-based browsers (excluding Electron). In Cypress’s benchmark loading 1,000 images, the HTTP/2 page finished in 1,362 ms compared with 3,896 ms over HTTP/1.1. Firefox and WebKit still use HTTP/1.1. You can opt out with forceHttp1: true.
  • Typing at full speed: the default delay for cy.type() is now 0 ms instead of 10 ms.
  • A faster visibility algorithm by default, with visibilityStrategy: 'legacy' to restore the old one.
  • Memory management on by default, renamed from experimentalMemoryManagement to manageBrowserMemory.
  • Retrying cookie and storage commands: cy.getCookie(), cy.getCookies(), cy.getAllCookies(), cy.getAllLocalStorage() and cy.getAllSessionStorage() are now query commands that retry.

Security and breaking changes

  • Cypress.env() is removed. It exposed every configured environment variable to the browser. It’s replaced by cy.env() for sensitive values, kept in the Node process, and Cypress.expose() for non-sensitive ones.
  • Electron is deprecated as a test browser and will be removed in a future major version. If you haven’t set --browser or defaultBrowser, your runs are probably using Electron now. Cypress’s deprecation post explains how to move to an installed browser.
  • cy.exec() is removed in favour of cy.task(), and cy.end() is gone.
  • The runtime moved to Node.js 24, Electron 41 and Chromium 146.

What changed in Playwright in 2026

Playwright shipped seven minor releases between January and October 2026.

Version Date Highlights
1.58 23 Jan Playwright CLI and SKILLs for coding agents, UI Mode and Trace Viewer improvements
1.59 1 Apr Screencast, CLI debugger and trace analysis for agents, await using
1.60 11 May HAR recording on tracing, drop API, aria snapshot updates, test.abort()
1.61 15 Jun WebAuthn passkeys, Web Storage APIs
1.62 24 Jul New stories-and-galleries component testing model, AbortSignal support, WebP screenshots, isolated retries
1.63 4 Sep Test locks, locating across frames, locator.visible(), step params
1.64 7 Oct WebMCP testing, better videos, testProject.default, Locator.within()

Dates are from the GitHub releases (UTC). Three features matter most for a framework decision.

Isolated retries (1.62)

The new retryStrategy: 'isolated' runs all retries at the end, one by one in a single worker, “to minimize interference with the rest of the suite.” That makes it easier to tell real flakiness from tests that fail only under parallel load.

Test locks (1.63)

Tests that share a resource can declare a named lock. Tests holding the same lock never run concurrently, across files, workers and projects, while everything else stays parallel. This solves a common reason teams turn parallelism off.

test('update user settings', { lock: 'user-settings' }, async ({ page }) => {
  // never runs at the same time as other tests holding 'user-settings'
});

Agent tooling (1.58 onwards)

Playwright CLI, Playwright MCP and, in 1.64, WebMCP support make Playwright the default browser layer for many coding agents. We compare the two agent interfaces in Playwright CLI vs Playwright MCP.

Browser support

Playwright supports Chromium, Firefox and WebKit, the engine behind Safari. If Safari matters to your users, that’s a significant advantage.

Cypress supports Chrome-family browsers and Firefox, with WebKit support marked experimental. With Electron deprecated, Cypress is steering teams towards installed browsers such as Chrome for Testing, Chrome, Firefox or Edge, so results reflect real user browsers.

The same test in both frameworks

A login test shows the difference in style. In Cypress, commands are chained and queued:

// cypress/e2e/login.cy.js
it('logs in', () => {
  cy.visit('/login');
  cy.get('[data-test=email]').type('user@example.com');
  cy.get('[data-test=password]').type('demo-password');
  cy.contains('button', 'Sign in').click();
  cy.contains('h1', 'Dashboard').should('be.visible');
});

In Playwright, each step is an awaited call on a locator:

// tests/login.spec.ts
import { test, expect } from '@playwright/test';

test('logs in', async ({ page }) => {
  await page.goto('/login');
  await page.getByLabel('Email').fill('user@example.com');
  await page.getByLabel('Password').fill('demo-password');
  await page.getByRole('button', { name: 'Sign in' }).click();
  await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
});

Both wait automatically. Playwright’s role- and label-based locators push you towards accessible markup. Cypress’s chain reads naturally but can surprise developers who expect ordinary async/await behaviour. In real suites, keep secrets out of test code. Cypress 16 removed Cypress.env() for exactly this reason: it exposed every configured variable to the browser. Use cy.env() for sensitive values and Cypress.expose() only for non-sensitive ones. In Playwright, read secrets from environment variables in the Node process.

Network interception

Both frameworks can stub and inspect network traffic: cy.intercept() in Cypress and page.route() in Playwright. Playwright 1.60 added HAR recording on tracing, useful for replaying real traffic.

Cypress 16 changed how interception works in Chrome, Chromium and Edge. Traffic is now intercepted on the browser’s native network stack, and your app negotiates whatever protocol the server supports, including HTTP/3. Cypress says most suites need no edits, but a few details report differently:

  • req.httpVersion is no longer reported.
  • Compression headers such as content-encoding no longer appear, because the body is already decoded.
  • Revalidated responses report 200 instead of 304.
  • res.statusMessage is empty over HTTP/2 and HTTP/3.

Firefox, WebKit and Electron are unaffected. If your tests assert on any of these, check the native network interception guide before upgrading. Cypress also notes that HTTP/2 makes streaming features more testable, since HTTP/1.1 caps Server-Sent Events at six connections per domain, while HTTP/2 negotiates concurrent streams, defaulting to 100.

Speed and parallelism

Raw speed comparisons depend heavily on the app, so be wary of benchmarks that don’t match your workload. What’s structural:

  • Playwright runs tests in parallel workers by default and supports sharding across machines without a paid service.
  • Cypress runs specs serially on one machine. Parallelisation across machines is a Cypress Cloud feature, and some teams use third-party orchestrators instead.

Cypress 16 closes some of the gap within a single run through HTTP/2, zero-delay typing and the faster visibility algorithm. For large suites, Playwright’s built-in parallelism is still usually the simpler path to short CI times.

Flakiness and debugging

Both frameworks auto-wait and retry assertions.

Cypress has time-travel debugging in its runner, and Cypress 16 removes some flake sources with retrying cookie and storage commands and default memory management.

Playwright has the Trace Viewer, UI Mode, isolated retries and test locks. Version 1.63 added aria and screen snapshots in traces, with a “Display Aria” mode.

For a deeper look at causes and fixes, see Flaky tests: causes, fixes and Playwright retries.

Component testing

Cypress has long had mature component testing, with Cypress 16 updating its toolchain to Vite 8 and current Angular versions.

Playwright’s component testing changed in 1.62 to a “stories and galleries” model. A story wraps a component in one scenario, a gallery page renders stories, and mount() returns a locator scoped to the story. If you’re evaluating Playwright for component tests, start with the new model rather than older tutorials.

AI and agent support

This is where the frameworks diverge most in 2026.

Playwright has invested heavily in being the browser layer for agents: Playwright MCP, Playwright CLI with SKILLs, Test Agents, CLI debugging and trace analysis for agents, and WebMCP. Slack’s study of 200+ agentic E2E runs used Playwright MCP, Playwright CLI and generated Playwright tests. We covered it in Agentic vs deterministic E2E tests.

Cypress has added its own AI and agent features during the 15.x line, listed in the Cypress 16 release post:

  • Studio AI (15.11.0). Cypress Studio records real interactions to generate or extend tests. Studio AI watches what changes in the UI while you record and recommends assertions, which you review before saving.
  • cy.prompt (15.13.0). Lets you write test steps in natural language and have them self-heal selectors as they run.
  • cypress tap (15.21.0). An extension of the Cypress CLI, free in the Cypress app, that lets you or an agent interact with an open-mode session from the terminal. An agent can run a spec, poll its status, read the failing test’s Command Log and error, and inspect the DOM at the moment a command ran.
  • AI-ready migration prompts. The Cypress migration guide includes a ready-made prompt for each major version that you can paste into a coding assistant to work through the upgrade.

So the gap is narrower than it was in 2025. The difference is mostly in breadth and openness. Playwright’s agent interfaces (MCP, CLI and WebMCP support) are open source, protocol-based and used by many third-party agents. Cypress’s features are tightly integrated with its own runner and Studio. If you plan to let general-purpose coding agents drive browsers outside a test suite too, Playwright fits more naturally. If you want AI help inside an existing Cypress workflow, cy.prompt, Studio AI and cypress tap are worth a trial.

Pricing

Both frameworks are free and open source. Costs arise from services:

  • Cypress Cloud adds parallelisation, analytics, visual reviews, UI coverage and accessibility checks, on paid plans with a free tier. Check Cypress pricing for current terms.
  • Playwright has no first-party paid dashboard in the framework itself. Teams use the HTML report and traces, or third-party services such as Currents.

Migrating from Cypress to Playwright

Many teams move in this direction. A pragmatic approach:

  1. Freeze new Cypress tests for one area and write new ones in Playwright.
  2. Port the most valuable flows first, not the easiest.
  3. Map concepts: cy.get() chains become locators, cy.intercept() becomes page.route(), custom commands become fixtures or helpers.
  4. Use auto-waiting properly and remove cy.wait(ms) equivalents.
  5. Run both in CI until coverage matches, then retire Cypress specs.

AI coding assistants are good at mechanical translation. Review the output carefully, especially waits and assertions.

Total cost of ownership

Licence cost is zero for both, so the real costs are elsewhere:

  • CI minutes. Built-in sharding lets Playwright spread a suite across machines without a paid orchestrator. With Cypress, cross-machine parallelisation usually means Cypress Cloud or a third-party service.
  • Maintenance. Flaky tests and brittle selectors cost more than any subscription. Both frameworks give you tools to fight this. What matters is whether your team uses them.
  • Upgrades. Cypress 16 has real breaking changes (Cypress.env(), cy.exec(), Electron). Playwright minor releases also include breaking changes, listed in each release’s notes, so pin versions and upgrade deliberately.
  • Skills. Hiring is easier for whichever framework your local market already knows. Both are widely used.

Before switching frameworks, measure what your current suite costs in CI time and flaky reruns. A migration only pays off if it fixes a cost you can name.

Staying on Cypress? A Cypress 16 checklist

  • Set defaultBrowser or --browser to an installed browser to move off Electron.
  • Replace Cypress.env() with cy.env() or Cypress.expose().
  • Replace cy.exec() with cy.task() and delete cy.end().
  • Check apps that depend on typing delays, now 0 ms by default.
  • Watch for HTTP/2 differences and use forceHttp1: true to debug.

Which should you choose?

Choose Playwright if:

  • You need Safari/WebKit coverage.
  • Your tests span multiple tabs, origins or browser contexts.
  • Your team works in Python, Java or .NET.
  • You want free built-in parallelism and sharding.
  • You plan to use coding agents and MCP heavily.

Choose Cypress if:

  • Your team values the in-browser runner and time-travel debugging.
  • You do a lot of component testing and like Cypress’s model.
  • You want an integrated paid dashboard with analytics, UI coverage and accessibility.
  • You have a large, healthy Cypress suite. Cypress 16 gives good reasons to upgrade rather than rewrite.

Frequently asked questions

Is Playwright better than Cypress in 2026?

Neither is better for everyone. Playwright leads on browser coverage, languages, built-in parallelism and agent tooling. Cypress leads on in-browser debugging experience and integrated Cloud features. Choose based on your app and team.

Is Playwright faster than Cypress?

It depends on your suite. Playwright’s built-in parallel workers and sharding often shorten CI times for large suites. Cypress 16 added HTTP/2, zero-delay typing and a faster visibility check to speed up individual runs.

Does Cypress support Safari?

Cypress lists WebKit support as experimental. Playwright supports WebKit as a standard browser.

What are the biggest changes in Cypress 16?

HTTP/2 by default in Chromium browsers, 0 ms typing delay, a faster visibility algorithm, memory management on by default, retrying cookie and storage commands, removal of Cypress.env() and deprecation of the Electron browser.

Which framework works better with AI coding agents?

Playwright currently has more agent tooling, including Playwright MCP, Playwright CLI, Test Agents and WebMCP support.

Does Cypress have AI features?

Yes. Cypress 15.x added Studio AI for recommended assertions (15.11.0), cy.prompt for natural-language, self-healing steps (15.13.0), and cypress tap (15.21.0), which lets an agent run and inspect an open-mode session from the terminal.

Should I migrate from Cypress to Playwright?

Only if Playwright fixes a cost you can name, such as missing Safari coverage, multi-tab flows or CI time. A healthy Cypress suite may be better served by upgrading to Cypress 16.

Further reading on CheckOps