Cypress Testing: Where It Excels and Where Teams Outgrow It
Shiplight AI Team
Updated on July 31, 2026
Shiplight AI Team
Updated on July 31, 2026

Browser testing was miserable before Cypress. Tests were written against a remote driver, debugging meant reading logs, and the feedback loop was long enough that people avoided writing them. Cypress made the experience good, and a lot of suites exist today that would not otherwise.
That contribution is real. So are the constraints, and they come from one architectural decision worth understanding before you commit.
Cypress is an end-to-end testing framework that runs inside the browser, in the same run loop as your application. Its runner shows tests executing step by step, lets you time-travel through them, and gives you the DevTools you already know.
That in-browser architecture is where both the strengths and the limits come from. It is not a detail.
The debugging experience. Watching a test execute with DOM snapshots at each step, then inspecting the failure with DevTools open, is still among the best in the category. When a test fails, you usually know why in under a minute.
Automatic waiting. Commands retry until they succeed or time out, which removes the manual sleep calls that make naive browser tests flaky.
Low barrier to writing. The API reads well and a frontend developer is productive quickly. Underrated: a framework people are willing to write tests in produces more tests.
Component testing. Mounting a component in a real browser sits usefully between unit tests and full E2E, and Cypress does it well.
Running inside the browser buys the debugging experience and costs the following.
Multiple tabs and windows. Not supported in the way tests sometimes need. Flows that open a new tab, an OAuth popup, a payment window, a document preview, require workarounds rather than a direct expression.
Cross-origin navigation. Historically painful and still more constrained than driving a browser from outside. If your flow crosses domains, expect friction.
Cross-browser depth. Chromium and Firefox are covered. WebKit support has lagged, and WebKit is how you catch Safari-specific problems without owning Apple hardware. If a meaningful share of your users are on iOS Safari, this is the constraint that decides it.
Language. JavaScript and TypeScript only. Fine for most frontend teams, a hard stop for a QA organization standardized on Python or Java.
Parallelism. Achievable, but historically easier when paying for the vendor's orchestration, which is a different cost shape from a runner that shards on its own.
None of these matter if your application is a single-origin Chromium-first web app. All of them matter eventually if it is not.
The migration usually happens for one of three specific reasons rather than general dissatisfaction:
Playwright vs Cypress covers that comparison properly. The short version: Playwright drives the browser from outside, which loses some of the in-browser debugging intimacy and gains tabs, origins, WebKit and a runner that parallelizes without a subscription.
If none of those three reasons applies to you, a working Cypress suite is not a problem in need of solving. Rewriting tests that pass is a cost with no user-visible benefit.
Cypress and Playwright both give you a good way to write a test. Neither has an opinion on the thing that actually kills suites: tests bound to selectors that change.
A test finding a button by CSS class works until someone renames the class. Multiply by a few hundred tests and one redesign, and the suite fails for reasons unrelated to whether the product works. The noisy tests get disabled to unblock a release, nobody re-enables them, and coverage decays while the dashboard stays green.
This is getting worse rather than staying flat, because coding agents refactor and rename far more aggressively than cautious humans do. Selector churn rises at exactly the moment test volume does.
Shiplight works on that layer rather than replacing a framework. Tests are written as intent, transpiled to Playwright plus an AI SDK, and run in ordinary Playwright browsers. When a cached locator goes stale, the step re-resolves from intent against the current page instead of failing, and the heal appears as a reviewable diff. An existing Playwright suite keeps running alongside, so adoption is incremental. Honest scope: web applications, and this does not migrate a Cypress suite for you.
For a single-origin, Chromium-first web application with a JavaScript team, yes. Its debugging experience is still among the best. The constraints are multi-tab flows, cross-origin navigation and WebKit coverage.
WebKit support has lagged behind the other engines. If catching Safari-specific problems matters to your users, this is the clearest reason teams choose otherwise.
It runs inside the browser alongside your application, which is what gives it the debugging experience and what prevents it from controlling a second tab directly.
Only for a specific reason: a flow needing a second tab, Safari bugs reaching production, or parallelism costs. A working suite is not worth rewriting on principle.
Yes, and well. Mounting a component in a real browser sits usefully between unit tests and full end-to-end coverage.