Playwright vs Selenium is not a choice between a modern tool and an obsolete one. It is a choice between two different operating models. Playwright is usually the stronger default for a new web end-to-end suite when its supported languages and browser model fit. Selenium remains the safer choice when standardized WebDriver interoperability, real-browser and vendor coverage, Grid infrastructure, Ruby support, or a large proven automation estate matters more than an integrated runner.
For an existing automation team, the right question is not “Which framework has more features?” Ask: Which risks must our suite cover, which constraints are non-negotiable, and would a migration improve the evidence we deliver enough to repay its cost? This guide gives you an answer-first comparison, a team-fit worksheet, and a migration plan that can produce evidence before you commit to a rewrite.
Playwright vs Selenium: the short decision
- Choose Playwright for a new web E2E suite when your team can use TypeScript/JavaScript, Python, Java, or .NET; Chromium, Playwright Firefox, and WebKit cover the required risk; and you value integrated isolation, waiting, tracing, parallelism, and reporting.
- Keep or choose Selenium when you require standards-based WebDriver interoperability, branded Firefox or Safari fidelity, Ruby, an established Java/.NET ecosystem, heterogeneous Grid nodes, a specific cloud vendor, or reusable infrastructure that already produces trustworthy results.
- Pilot both when the constraint is unclear. Port one representative vertical slice and compare retry-free stability, diagnostic evidence, browser coverage, CI cost, and maintainer effort. Do not use a one-test speed demo as a migration business case.
A team can also use both deliberately. For example, Playwright can own fast product-team feedback while Selenium retains a small compatibility suite on real browsers or a vendor grid. Dual-stack is a cost, but it can be a sensible transition state when each suite has a defined owner and exit rule.
Comparison matrix for automation engineers
| Decision factor | Playwright | Selenium | What it means for a team |
|---|---|---|---|
| Core architecture | Coordinated automation library plus matched browser builds; Playwright Test is integrated for Node.js | W3C WebDriver client/server model with browser-specific drivers and optional Grid | Playwright reduces assembly work; Selenium maximizes interoperable components and deployment choices |
| Waiting | Locator actions perform actionability checks; web-first assertions retry | Explicit waits express the expected condition; navigation uses a page-load strategy | Both can be stable, but Selenium needs a more deliberate wait policy |
| Languages | TypeScript/JavaScript, Python, Java, .NET | Java, Python, C#, Ruby, JavaScript | Playwright Test is a Node.js runner; other Playwright languages use their ecosystem runners |
| Browser model | Chromium, patched Firefox, WebKit, plus branded Chrome and Edge channels | Vendor/browser WebDriver implementations including Chrome, Edge, Firefox, and Safari | Do not equate Playwright WebKit with branded Safari or its patched Firefox with branded Firefox |
| Remote execution | Parallel workers and sharding; remote/cloud support depends on the chosen service and setup | Mature RemoteWebDriver, Grid, and cloud ecosystem | Selenium often fits heterogeneous or vendor-managed estates more naturally |
| Tooling | Projects, fixtures, retries, reporters, codegen, UI Mode, screenshots, video, and traces in one runner | WebDriver, Selenium Manager, Grid, and IDE; runner/reporting come from the host ecosystem | Integrated defaults versus composable infrastructure |
| Isolation | A fresh browser context per test by default in Playwright Test | Lifecycle is designed by the runner and framework | Playwright makes the safe default easy; Selenium lets mature teams keep established lifecycle controls |
| Maturity | Younger, fast-moving, production-capable ecosystem | Originated in 2004, broad installed base and institutional knowledge | Measure maturity against your dependencies, not the project age alone |
| Migration cost | Can simplify new suites, but a rewrite must re-establish test intent and evidence | Existing suites retain option value when healthy | A pilot should prove benefits before a broad conversion |
1. Architecture: coordinated stack versus standard interface
WebDriver is a W3C standard for remotely controlling a browser through a platform- and language-neutral interface. Selenium bindings send commands through the appropriate browser driver. The browser, driver, and test process can run together, or Selenium Server/Grid can place them on different machines. That separation is valuable when an organization needs multiple operating systems, real vendor browsers, a device cloud, or an established remote execution service.
Playwright provides a coordinated automation library and installs browser revisions tested with that library version. Its default engines are Chromium, a patched Firefox build, and WebKit; branded Chrome and Edge channels are also supported. The Node.js distribution adds Playwright Test, a runner that owns fixtures, projects, workers, retries, artifacts, and per-test isolation. This is why Playwright often feels like one product while Selenium feels like a component in a larger test platform.
The distinction matters in architecture reviews. A Java team using Selenium, JUnit 5 extensions, Maven, an internal Grid, Allure, and a test-data service does not have an incomplete framework. It has a composed platform. A TypeScript product team starting from zero may prefer Playwright Test because good defaults arrive together and evolve together. The first model prizes interoperability; the second prizes coordination.

Start with product constraints: browser fidelity, language, remote infrastructure, and migration value—not a generic feature count.
What WebDriver BiDi changes
Classic WebDriver is primarily command and response. WebDriver BiDi adds a bidirectional WebSocket channel for events and domains such as logging, network, and script. This closes part of the historical gap for event-driven browser automation. The Selenium documentation also notes that the available API surface grows with the standard and browser implementations, so verify the exact BiDi feature your suite needs rather than assuming parity from the name.
Playwright already exposes rich event-driven browser capabilities through its own API. That makes many network, popup, download, and multi-page workflows straightforward today. Selenium’s advantage is not that every capability is identical; it is that its central automation interface is standardized and widely implemented.
2. Waiting and flakiness: compare policies, not slogans
Playwright locators are strict and action-aware. Before a click, for example, Playwright checks that the locator resolves to one element and that the target is visible, stable, able to receive events, and enabled. Playwright Test’s web-first assertions retry until the expected state appears or the timeout expires. These defaults remove a large class of timing code.
import { test, expect } from '@playwright/test';
test('wait for order status', async ({ page }) => {
await page.goto('/orders/42');
await expect(page.getByTestId('order-status')).toHaveText('Ready');
});
Selenium supports explicit waits that poll until a defined condition succeeds. That is not inherently inferior; it makes the synchronization condition visible. The maintenance problem appears when a suite mixes implicit and explicit waits, scatters fixed sleeps, caches elements that later become stale, or lets every page object invent a different policy.
import { Builder, By, until } from 'selenium-webdriver';
const driver = await new Builder().forBrowser('chrome').build();
try {
await driver.get('https://example.test/orders/42');
const status = await driver.findElement(By.css('[data-testid="order-status"]'));
await driver.wait(until.elementTextIs(status, 'Ready'), 5000);
} finally {
await driver.quit();
}
These equivalent examples were compiled and executed against a controlled local page with Playwright 1.62.1 and Selenium 4.48.0. That validates the examples, not a performance claim. A real comparison needs repeated CI runs on representative flows.
Auto-waiting still needs domain assertions
Playwright does not eliminate all waits. An enabled button does not prove that a back-office job completed. A visible success message does not prove that data reached a downstream system. Downloads, emails, queues, eventual consistency, and multi-system propagation still need an explicit observable condition. Good Playwright tests wait less on DOM mechanics and spend more precision on business readiness.
For Selenium, define one synchronization policy: avoid fixed sleeps, do not mix implicit and explicit waits, locate elements as late as practical, and name waits after observable states. For Playwright, prefer locators and retrying assertions, avoid unnecessary waitForTimeout, and document the few product-specific readiness signals. Both tools reward the same principle: wait for evidence, not elapsed time.
3. Language ecosystem and runner fit
Language support is often more decisive than browser API ergonomics. Playwright officially supports TypeScript/JavaScript, Python, Java, and .NET. Selenium officially supports Java, Python, C#, Ruby, and JavaScript. The lists look similar, but the runner experience is not.
Playwright Test is the Node.js test runner. It should not be described as a bundled runner for every Playwright language. Python teams commonly use the official pytest plugin. Java teams integrate Playwright with JUnit or TestNG. .NET teams can use MSTest, NUnit, or xUnit base classes. Those APIs still provide Playwright’s browser automation model, but projects, fixtures, CLI behavior, and reporter choices follow the language integration.
Selenium deliberately does not dictate a runner. Java organizations can retain JUnit/TestNG, Maven or Gradle conventions, dependency injection, reporting extensions, and existing test lifecycle hooks. .NET, Python, JavaScript, and Ruby teams make equivalent ecosystem choices. This composition costs setup effort, but it can be an advantage when the rest of the engineering organization already standardizes those tools.
| Team situation | Likely advantage | Reason |
|---|---|---|
| TypeScript product team building a new suite | Playwright Test | Runner, fixtures, isolation, browser projects, artifacts, and tooling arrive together |
| Java QA platform with mature JUnit/TestNG extensions | Depends on pilot | Playwright Java can fit, but runner and organizational investment may reduce migration value |
| Ruby automation estate | Selenium | Selenium has an official Ruby binding; Playwright does not |
| Polyglot organization requiring one standard interface | Selenium | WebDriver’s cross-language standard can simplify shared infrastructure contracts |
| Team prioritizing one opinionated E2E operating model | Playwright Test | Coordinated defaults reduce framework assembly and local variation |
If Playwright fits your language choice, use the relevant implementation guide rather than translating Node examples blindly: Playwright TypeScript, Playwright Java, or Playwright Python.
4. Browser support: engine coverage is not fidelity
Playwright runs Chromium, WebKit, and its patched Firefox on Windows, Linux, and macOS. It also supports branded Chrome and Edge channels. This provides excellent cross-engine feedback for most modern web applications. Projects make it easy to run the same suite with different browsers, viewports, permissions, locales, and device profiles.
However, the official Playwright browser documentation is explicit: its Firefox build is patched and does not match branded Firefox, and Playwright WebKit is not branded Safari. Running WebKit on macOS gets closer to Safari’s platform behavior, but it is not a substitute for every Safari, iOS, enterprise-policy, codec, extension, or assistive-technology risk.
Selenium’s browser documentation covers Chrome, Edge, Firefox, Safari, and browser-specific functionality. Combined with RemoteWebDriver and Grid, teams can route sessions to heterogeneous Windows, macOS, and Linux nodes or to commercial browser clouds. That is a material advantage when certification requires exact browser versions, real Safari, enterprise images, or capabilities offered by an existing vendor.
Neither desktop engine emulation nor a mobile viewport is a real phone. If a purchase flow, regulated workflow, media application, extension, SSO policy, or accessibility path depends on the production device, keep real-device/manual coverage in the test strategy. Start the tool decision with a signed browser-and-device matrix:
- List production usage and business-critical browser/device paths.
- Separate “engine coverage is sufficient” from “exact branded browser or device is required.”
- Record operating system, version, enterprise policy, proxy/certificate, codec, extension, and accessibility constraints.
- Prove each required combination in CI or the chosen cloud before selecting the framework.
5. Tooling and debugging
Playwright Test’s integrated tooling is a persuasive reason to adopt it. Projects model browsers and environments. Fixtures model dependencies and lifecycle. Parallel workers and sharding distribute execution. The HTML, blob, JUnit, JSON, and GitHub reporters serve different CI consumers. Code generation can bootstrap actions and locators. UI Mode helps explore tests, while Trace Viewer can combine actions, DOM snapshots, network, console, source, and timing into a portable diagnostic artifact.
This integration improves debugging only if the team enables and retains the right artifacts. A trace recorded on the first retry is useful; a suite that retries every failure until green can conceal risk. Define who reviews traces, how long artifacts remain available, which failures block a release, and which retry metrics are tracked. Tools cannot replace an operating policy.
Selenium provides WebDriver, Selenium Manager, Grid, and Selenium IDE. Selenium Manager is used by bindings to discover or provision drivers when one is not configured, removing much of the historical manual-driver friction. Teams still choose the runner, assertions, screenshots/video, logs, reports, retries, and observability integrations. A mature platform may already have stronger organization-specific evidence than an off-the-shelf runner.
For new Playwright work, keep the foundation small. The Playwright installation guide covers environment setup, the locator guide defines maintainable selector policy, and the production framework guide covers fixtures, utilities, environments, data, and reporting. Do not rebuild these topics inside a comparison decision.
6. Maturity, ecosystem, and organizational risk
Selenium began in 2004. Its installed base, vendor integrations, language communities, Grid deployments, hiring pool, and organizational knowledge are genuine assets. The current Selenium 4 line uses the W3C protocol and continues to add BiDi capabilities. Calling Selenium obsolete ignores both current development and the reasons enterprises depend on it.
Playwright is younger, but “younger” does not mean experimental. It is a production-capable project with a cohesive runner, rich debugging, rapid releases, and strong modern-web ergonomics. Its faster release cadence does mean teams should pin the package and lockfile, install the browser revision that matches the package, test upgrades in a controlled branch, and account for browser downloads in caches and restricted networks.
Evaluate maturity against your dependency graph:
- Does the chosen browser cloud expose the capabilities and artifacts you need?
- Can CI download or mirror packages and browser binaries behind the proxy?
- Do certificates, authentication, extensions, downloads, and file dialogs behave in the target environment?
- Are accessibility, visual testing, observability, test-data, and reporting integrations proven?
- Can enough maintainers diagnose failures in the language and runner?
- Is there an owned upgrade process with rollback and compatibility checks?
A 5,000-test Selenium estate is not merely 5,000 API calls. It encodes test intent, data setup, failure oracles, release evidence, CI behavior, and years of edge cases. A healthy suite has option value. Conversely, a slow, flaky estate with unclear ownership is not valuable just because it is large. Measure the signal it produces.
7. When Playwright is the better fit
Playwright is usually the stronger choice when most of these statements are true:
- The application is a modern web product and Chromium/WebKit/Playwright Firefox coverage matches the accepted risk.
- The team can use one of Playwright’s official languages, especially TypeScript for the integrated Playwright Test experience.
- A new or unhealthy suite needs consistent isolation, locator, retry, parallelism, and artifact defaults.
- Rich trace evidence would materially shorten failure diagnosis.
- Tests require multiple contexts, popups, downloads, network control, or other event-heavy browser workflows.
- The team is willing to redesign abstractions around user-visible behavior instead of porting a Selenium framework line for line.
This is a fit decision, not permission to create a giant abstraction layer. Begin with Playwright’s fixtures, locators, and projects; introduce utilities only after repeated product needs justify them. The broader Playwright automation guide explains the platform, while your test strategy should decide which risks belong below, at, or above the UI.
8. When Selenium is the better fit
Selenium remains the rational choice when one or more constraints dominate:
- Certification requires branded Firefox, Safari, exact browser versions, enterprise images, or vendor-specific capabilities that your Selenium infrastructure already supports.
- A heterogeneous Grid or commercial cloud is a strategic shared service.
- The required language is Ruby, or the organization has deep reusable Java/.NET/Python runner extensions and skills.
- The current suite is stable, fast enough, diagnosable, and aligned with business risk.
- Migration would consume roadmap capacity without improving coverage, release confidence, or ownership.
- Multiple teams need the W3C WebDriver interface as an interoperability contract.
Keeping Selenium should still be an active engineering decision. Upgrade current bindings, use Selenium Manager or an approved driver policy, eliminate fixed sleeps, standardize explicit waits, improve failure artifacts, and simplify page abstractions. “Do not migrate” is not the same as “do not modernize.”
9. A scored decision worksheet
Do not copy a universal score from a blog post. Set the importance of each factor for your product, then score the tools from evidence collected in your environment.
- Assign each factor an importance weight from 0 to 3: 0 means irrelevant; 3 means release-critical.
- After a pilot, assign each tool a fit score from 0 to 3: 0 means unsupported; 3 means proven and maintainable.
- Multiply importance by fit for each row. Record the evidence beside the number.
- Treat any zero on a release-critical constraint as a gate, even if the total score is high.
| Factor | Importance 0–3 | Playwright fit 0–3 | Selenium fit 0–3 | Evidence to collect |
|---|---|---|---|---|
| Exact production browser/device fidelity | Required matrix passing in the target environment | |||
| Vendor, cloud, and Grid interoperability | Capabilities, queue behavior, artifacts, and support agreement | |||
| Required language and runner extensions | Working integrations and maintainers, not roadmap promises | |||
| Default isolation and synchronization | Retry-free pilot stability and leak checks | |||
| Debugging and trace evidence | Time to diagnose seeded and real failures | |||
| Network, popup, download, and multi-user flows | Representative complex scenarios | |||
| CI, proxy, certificate, and install constraints | Clean build on production-like agents | |||
| Existing suite and platform value | Healthy coverage, reuse, owner depth, and replacement cost | |||
| Hiring, onboarding, and maintainer depth | Time for a new engineer to make and debug a change | |||
| Migration opportunity cost | Engineering weeks versus forecast risk reduction |
Review scores with engineering, QA, platform, security, and product risk owners. A testing team may favor trace ergonomics while the platform team knows that browser binaries cannot currently cross the corporate proxy. A product owner may accept engine coverage for most flows but require real Safari for payment. The discussion behind the scores is more valuable than the arithmetic.
10. How to migrate from Selenium to Playwright safely
A migration should reduce risk, not create a long period with less coverage. Use a staged, reversible approach.
Step 1: inventory the Selenium estate
Classify tests by business risk, browser/device requirement, language, runtime, failure rate, retry dependence, data setup, remote/Grid dependency, special browser APIs, and owner. Identify redundant UI tests that belong at API or component level. Do not assume every existing test deserves a direct replacement.
Step 2: select a representative vertical slice
Choose more than a happy-path login. Include authentication, one revenue- or workflow-critical journey, one popup or download, one network-dependent case, and at least one required non-Chromium browser. Include a historically flaky scenario if its cause is understood. The slice should exercise the reasons you are considering a switch.
Step 3: define acceptance gates before coding
Agree on pass/fail semantics, required browsers, retry-free stability, median and tail duration, CI resources, diagnostic artifacts, maintainer effort, and security requirements. Specify a sample size—such as enough scheduled CI runs to cover normal infrastructure variation—rather than declaring victory after a green afternoon.
Step 4: build a thin Playwright foundation
Validate environment variables and secrets, define browser/environment projects, create worker- or test-scoped fixtures only where needed, set a locator policy, retain useful traces and screenshots, and guarantee cleanup. Preserve product-facing concepts, but do not automatically recreate base pages, wrapper methods, custom waits, or deep inheritance from Selenium.
Step 5: run both implementations in parallel
Execute the slice against equivalent environments and data. Compare correctness first, then stability, diagnostic quality, duration distribution, infrastructure cost, and change effort. Investigate disagreements: one implementation may reveal a real race that the other silently tolerated.
Step 6: decide route by route
Each scenario can migrate to Playwright, remain in Selenium, move below the UI, or be retired as redundant. Stop adding Selenium coverage in a migrated domain only after the Playwright path meets the gate. Remove the old test only after equivalent risk coverage is proven and stakeholders can find the new evidence.
Step 7: define the dual-stack exit rule
Temporary dual-stack has two dependency trees, two upgrade paths, and two skill requirements. Give it an owner, budget, and end condition. An example: “Retire Selenium coverage in checkout after Playwright passes the required browser matrix with no unexplained retries across 100 CI runs and release owners accept its artifacts.” Keep Selenium deliberately for any separately documented compatibility suite.
11. Concept mapping for experienced Selenium engineers
| Selenium concept | Playwright direction | Migration note |
|---|---|---|
| WebDriver session | Browser plus isolated browser contexts | Use a context per test rather than sharing mutable session state |
| Explicit expected condition | Locator actionability and web-first assertion | Keep explicit product-state conditions; remove mechanical polling that locators own |
| By.css / By.xpath | getByRole, getByLabel, getByText, getByTestId, locator | Prefer user-visible contracts and resilient test IDs; do not mechanically convert selectors |
| JUnit/TestNG/pytest/NUnit runner | Playwright Test in Node.js, or language-native runner elsewhere | Separate Playwright library features from Playwright Test runner features |
| Driver/browser lifecycle hooks | Fixtures and projects | Model scope explicitly and keep tests isolated |
| Grid capability matrix | Projects, workers, sharding, or supported remote service | Prove exact remote/browser constraints; these are not one-to-one concepts |
| Screenshot/log listeners | Runner artifacts, reporters, and traces | Define retention and triage policy rather than enabling everything indefinitely |
| Page Object Model | Page objects and smaller component/fixture abstractions | Preserve useful domain language; remove generic wrappers around every API call |
12. Migration anti-patterns to avoid
- Big-bang rewrite: it creates a long period where new tests are unproven and old coverage decays.
- Line-for-line translation: Selenium waits and wrapper layers can erase Playwright’s locator and isolation advantages.
- Framework before scenarios: building months of abstractions before a representative test passes postpones the evidence needed for the decision.
- Retry as a quality metric: a suite that becomes green after retries can still be unreliable. Track first-attempt pass rate and unexplained retry rate.
- Browser-engine hand waving: “WebKit means Safari” and “Firefox means branded Firefox” can leave a certification gap.
- Demo-speed benchmark: one test on one laptop says little about CI tail latency, resource contention, or diagnostic time.
- Permanent accidental dual-stack: without ownership and an exit rule, both suites expand and duplicate cost.
- Ignoring the test pyramid: migrating redundant UI cases preserves the wrong coverage at a new API.
13. Using AI during evaluation without leaking data
AI can help inventory patterns, propose locator replacements, explain a trace, or draft a pilot plan. Treat its output as a reviewable suggestion. Never paste production credentials, customer data, private source code, internal URLs, proprietary selectors, or trace files into an unapproved model. Use organization-approved tooling, redact artifacts, and execute generated code only in a controlled branch.
A safe prompt structure is:
We are evaluating Selenium and Playwright for a web E2E suite.
Constraints: [approved languages, required browsers, Grid/cloud, CI policy].
Pilot flows: [sanitized flow descriptions].
Acceptance gates: [stability, evidence, duration, maintainability].
Identify unknowns, propose a reversible pilot, and separate verified facts
from assumptions. Do not request secrets, customer data, or private URLs.
Validate AI recommendations against the Playwright documentation, Selenium WebDriver documentation, your browser/vendor contract, and a reproducible local or CI test.
Frequently asked questions
Is Playwright better than Selenium?
Playwright is often the better default for a new modern-web suite because its Node.js runner integrates isolation, waiting, parallelism, and diagnostics. Selenium is better when standardized WebDriver interoperability, exact browser/vendor/Grid reach, Ruby, or an established healthy estate is a release-critical constraint. The better tool is the one that proves required coverage and sustainable ownership.
Is Selenium obsolete in 2026?
No. Selenium 4 implements standardized WebDriver, has an active Grid and browser ecosystem, includes Selenium Manager, and continues to develop WebDriver BiDi capabilities. On September 1, 2026, when this guide was technically reviewed, the official downloads page listed Selenium 4.48.0, while npm listed Playwright Test 1.62.1. Pin versions in CI and recheck release notes before upgrading. A team should evaluate current Selenium, not the driver-management experience of a decade ago.
Does Playwright eliminate flaky tests?
No framework eliminates flaky products, data, infrastructure, or assertions. Playwright’s locator actionability and retrying assertions remove common synchronization mistakes, but business readiness still needs explicit evidence. Isolation, deterministic data, observable oracles, and disciplined retry policy remain essential.
Can Playwright replace Selenium Grid?
Playwright Test supports local parallel workers, browser projects, and sharding, and some cloud providers offer Playwright execution. That does not automatically replace a heterogeneous Grid or every vendor capability. Prove the exact browser, operating-system, network, queue, artifact, and support requirements before migrating remote execution.
Should a Java team switch from Selenium to Playwright?
Only if a representative pilot shows enough benefit. Playwright has an official Java library and works with JUnit or TestNG, but Playwright Test is a Node.js runner. A Java team with mature Selenium extensions and Grid infrastructure may gain less than a team with an unstable or new suite.
Can Selenium and Playwright coexist?
Yes. A staged migration or deliberate split can keep Selenium for compatibility coverage while Playwright owns product-team feedback. Coexistence needs clear scenario ownership, separate dependency maintenance, reporting that avoids double counting, and an explicit exit or retention rule.
What should we measure in a Playwright migration pilot?
Measure correctness, required browser coverage, first-attempt pass rate, unexplained retries, median and tail duration, CI resources, artifact quality, time to diagnose failures, change effort, and maintainer onboarding. Compare distributions across enough normal CI runs; do not crown a winner from a single timing.
Final recommendation
For a new web-only end-to-end suite, start the evaluation with Playwright. Its coordinated browser automation and runner defaults usually let a team establish isolation, synchronization, parallel execution, and useful evidence with less framework assembly. Confirm that its language and browser model cover the actual product risks.
For an existing Selenium organization, start with the estate—not the hype cycle. Keep Selenium when it already delivers reliable evidence across required browsers and infrastructure. Pilot Playwright when debugging cost, synchronization inconsistency, framework sprawl, or modern multi-context workflows create measurable pain. Migrate only the domains where the pilot meets a pre-agreed gate, and retain Selenium where its interoperability remains valuable.
The defensible Playwright vs Selenium decision is therefore rarely “rewrite everything” or “never change.” It is a constraint-led choice, supported by a representative pilot, with a clear owner and an exit rule.
