Playwright Killed Cypress and I’m Not Sorry

For years, Cypress felt like the rare end-to-end (E2E) testing tool that didn’t make developers want to set fire to their laptops. It was fast, friendly, and made “write integration tests” sound almost enjoyable. But good tools get replaced when the fundamentals stop matching how real apps work—multi-browser reality, auth flows, multiple tabs, and flaky timing. Playwright doesn’t just improve the experience. It fixes the structural problems that made Cypress feel like a good first act instead of the final one.
Why Cypress Was a Revelation (and Why That Matters)⌗
Cypress arrived at the exact moment E2E testing was in decline. Selenium-based approaches were brittle, slow, and miserable to debug. Cypress changed the emotional tone: tests ran in the browser, the UI showed what happened, and writing “realistic” user flows wasn’t a chore.
It also normalized a development workflow many teams wanted:
- Write tests alongside the app.
- See failures immediately.
- Debug with a time-travel style runner.
- Get deterministic-ish results through built-in waiting and control.
If you used Cypress for a year and felt like your testing strategy finally stopped fighting you, you’re not imagining it. Cypress had momentum for a reason.
But here’s the trade-off: Cypress made certain assumptions that are great for some apps and painful for others. Over time, those assumptions became the reasons teams either grew around Cypress—or grew out of it.
And once you’ve been burned by enough “works on my machine / only in Chrome / only in one tab / only same-origin” edge cases, the honeymoon ends.
The Dealbreakers Cypress Couldn’t Outgrow⌗
Let’s be blunt about the flaws that started as limitations and turned into dealbreakers.
1) Single-browser-at-a-time execution⌗
Modern frontends aren’t just “Chrome apps.” They’re shipped to users running Chromium, Firefox, and Safari/WebKit, often all at once in the same CI pipeline.
Cypress’s execution model made “run the exact same E2E suite everywhere” more cumbersome than it should be. You can compensate with parallelization and configuration gymnastics, but you still end up with a testing strategy that feels heavier than it needs to.
2) Authentication and state sharing got awkward⌗
E2E testing always hits auth. Whether you’re using cookies, tokens, SSO redirects, or multi-step login flows, you don’t want to repeat the same expensive login for every test case.
Cypress can do auth workflows, but the model often pushes teams toward workarounds—custom helpers, manual state management, or patterns that feel brittle when the app changes.
3) Multi-tab and window behavior aren’t optional⌗
Real apps open new tabs, spawn popups, and rely on window context. OAuth and some third-party integrations effectively demand it.
If your E2E suite can’t reliably handle multi-tab workflows, you either stop testing the real user path or you accept chronic flakiness. Both are bad. One hides bugs. The other wastes developer time.
4) Same-origin constraints can force unnatural testing patterns⌗
Many apps are cleanly same-origin. Many aren’t. Even when your app is “mostly” same-origin, modern architecture introduces cross-origin behavior—CDNs, identity providers, payment pages, embedded widgets, and more.
When your testing tool struggles with cross-origin realism, your E2E suite becomes less of a mirror and more of a simplified cartoon of the product.
Those are not minor inconveniences. They’re the difference between “tests that build confidence” and “tests that create doubt.”
Why Playwright Wins: Speed, Reliability, and True Multi-Browser⌗
Playwright addresses these problems in a way that feels like a design decision, not a collection of plugins.
Multi-browser by default⌗
Playwright runs against Chromium, Firefox, and WebKit. That means the same E2E suite is exercised across rendering engines without you rewriting everything or maintaining separate strategies.
Practically, this changes how teams plan releases. Instead of “we’ll see Safari issues later,” you get feedback early because Safari/WebKit is part of the routine.
Better reliability through auto-waiting⌗
Flakiness is rarely about your app suddenly turning evil. It’s about mismatched assumptions: the test thinks an element is ready before the browser does, or the DOM is in flux and the click happens “too early.”
Playwright’s auto-waiting model is built to reduce these timing mismatches. You don’t have to litter tests with arbitrary wait(1000) calls just to keep them green. The result is an E2E suite that behaves more like a conversation with the UI rather than a rigid script.
Authentication state sharing that doesn’t feel like a hack⌗
Instead of forcing every test to walk through login like a ritual, Playwright lets you reuse authenticated state across the suite. In practice, teams often move toward a pattern like:
- Authenticate once (e.g., via a storage state file).
- Run many tests as the authenticated user.
- Keep the suite focused on the behaviors that matter.
This is one of those “infrastructure” improvements that compounds. Faster tests lead to more frequent runs, which lead to earlier bug discovery, which leads to fewer “big bang” releases where nobody trusts the pipeline.
Multi-tab and window flows that match reality⌗
OAuth, payment providers, “open in new tab,” embedded flows—these are not exotic edge cases. They’re core to modern apps.
Playwright can handle multi-page scenarios cleanly, so your E2E tests can model the real browser experience instead of forcing the product into a single-tab testing fantasy.
The Most Magic Part: Recording Tests that Actually Help⌗
Cypress had an ace here: the runner and debugging experience made you feel like you were driving the browser. Playwright takes it further with a test generator that records your actions and produces usable code.
And “usable” is the key word. Many record-and-replay tools spit out output that looks clever but quickly turns into archaeology. Playwright’s generator produces code you can refine rather than code you must rewrite from scratch.
Here’s what that looks like in a practical workflow:
- You start by recording a key user journey—say, “create an account, land on the dashboard, add an item.”
- The generator gives you a scaffold for selectors, navigation, and assertions.
- You review the output and replace brittle selectors with stable ones (data attributes).
- You add assertions that reflect business outcomes, not just UI states.
That means you can bootstrap coverage quickly without sacrificing engineering discipline. You get the speed of automation with the maintainability you’d expect from handwritten tests.
A Practical Migration Playbook (Without the Pain)⌗
“Cypress to Playwright” can sound like a rewrite project. It doesn’t have to be. You can migrate in slices and keep shipping.
1) Start with the highest-signal flows⌗
Don’t port everything at once. Pick the E2E tests that:
- represent core user journeys,
- cover the most bug-prone areas,
- run frequently in CI,
- and are the most painful today (flaky timing, auth overhead, cross-origin weirdness).
If your Cypress suite is already healthy, you might migrate less urgently. But if it’s slowing you down or forcing workarounds, prioritize what hurts.
2) Standardize selectors early⌗
A migration goes smoother when you pick a selector strategy and stick to it. The simplest, most reliable approach is usually:
data-testidfor test hooks,- and minimal reliance on fragile DOM structures.
This reduces churn when UI changes.
3) Centralize auth state⌗
If you’re wasting time logging in during every test, fix that first. In Playwright, treat authentication state as an artifact of your suite—generated once, reused everywhere.
Even if you’re migrating gradually, centralizing auth will make the new tests instantly faster and more stable than the ones that repeat login workflows.
4) Use Playwright’s expectations like product contracts⌗
E2E tests should assert business-relevant outcomes. Instead of “click happened,” assert:
- the user sees the created entity,
- the cart totals are correct,
- the success message appears with the right content,
- and navigation lands on the right page.
This is how you avoid “tests that pass but don’t matter.”
5) Run both suites during transition⌗
For a limited time, keep Cypress and Playwright running for coverage overlap. That gives you confidence and helps you identify gaps without halting development.
You’ll also learn quickly what kinds of flows your team needs to model differently in Playwright (especially multi-tab behavior).
Conclusion: Cypress Had a Great Run—But Playwright Is the Real Platform⌗
Cypress earned its reputation for making E2E testing feel approachable. But the industry moved: multi-browser needs are non-negotiable, auth is too complex for repetitive flows, and modern apps increasingly rely on multi-page realities.
Playwright isn’t a “better Cypress.” It’s a more complete E2E platform designed around how browsers actually behave—fewer timing problems, first-class multi-browser support, cleaner auth state sharing, and recording that accelerates implementation without sabotaging maintainability.
If your E2E strategy is still making you fight the tool, stop fighting it. Use the one that doesn’t require you to compromise with the truth of the browser.