Selenium to Playwright Migration Part 1: Why Migrate and How to Plan It
This is part of the Selenium to Playwright Migration Series. Follow the complete 7-part tutorial to migrate your test suite from Selenium Java to Playwright TypeScript.
Playwright communicates directly with browsers via WebSocket (CDP/BiDi), eliminating the driver middleman. This means faster execution, better reliability, and no driver version management. Here is the complete comparison and migration planning guide.
Contents
Selenium vs Playwright Feature Matrix
| Feature | Selenium (Java) | Playwright (TypeScript) |
|---|---|---|
| Protocol | WebDriver (W3C) via HTTP | CDP / BiDi (direct WebSocket) |
| Auto-Wait | None (manual waits) | Built-in actionability checks |
| Parallel Execution | Grid + TestNG threads | Built-in workers + sharding |
| Browser Management | Separate drivers (ChromeDriver) | Bundled (npx playwright install) |
| Test Isolation | Manual (ThreadLocal) | Built-in (BrowserContext per test) |
| Debugging | Breakpoints + logs | Inspector + Trace Viewer + UI Mode |
| API Testing | REST Assured (separate) | Built-in APIRequestContext |
| Network Mocking | 3rd party tools | Built-in page.route() |
| Video Recording | External tools | Built-in video support |
| Visual Testing | Applitools / add-ons | Built-in toHaveScreenshot() |
| Mobile Emulation | Appium (separate) | Built-in device emulation |
| AI Integration | Limited | MCP Server + Codegen + AI Agents |
Architecture Comparison
Selenium Architecture
Test Code (Java)
|
v
WebDriver API (driver.findElement, click, sendKeys)
|
v
JSON Wire / W3C WebDriver Protocol (HTTP)
|
v
Browser Driver (ChromeDriver, GeckoDriver)
|
v
Browser (Chrome, Firefox, Edge)
Playwright Architecture
Test Code (TypeScript)
|
v
Playwright API (page.locator, click, fill)
|
v
CDP / BiDi Protocol (WebSocket - direct!)
|
v
Browser (Chromium, Firefox, WebKit)
Key Insight: Playwright eliminates the driver middleman entirely. No more ChromeDriver version mismatches. No more Selenium Grid for parallelization. No more WebDriverWait boilerplate.
TypeScript Quick Reference for Java Developers
| Java | TypeScript | Notes |
|---|---|---|
String name = "test"; | const name = 'test'; | const/let, type inference |
public void click() | async click(): Promise<void> | All browser ops are async |
element.click(); | await element.click(); | Must await async calls |
List<String> | string[] | Array syntax |
Map<String, Object> | Record<string, unknown> | Or { [key: string]: unknown } |
@FindBy(id="x") | () => page.locator('#x') | Arrow functions replace annotations |
import com.x.LoginPage; | import { LoginPage } from './pages'; | ES module imports |
Migration Strategy: Bottom-Up Incremental
- Pilot Critical Paths: Pick 5-10 high-value P0 Selenium tests. Stand up Playwright project with conventions.
- Parallel Run and Baseline: Keep Selenium running. Add Playwright CI job. Compare flake rate and duration.
- Scale Conversion: All new features in Playwright only. Convert flaky/slow Selenium tests first.
- Sunset Selenium: Retire legacy TestNG suites once coverage and stability thresholds are met.
Implementation Order: Always go bottom-up: Config -> Utilities -> Pages -> Modules -> Tests -> CI. This ensures dependencies exist before consumers.
Migration Priority Table
| # | Action | Why |
|---|---|---|
| 1 | Replace locators first | Improves stability the most |
| 2 | Remove unnecessary waits | Reduces flaky timing logic |
| 3 | Convert assertions to expect | Enables auto-retry and reliability |
| 4 | Rework frames, tabs, dialogs | Simplifies control flow |
| 5 | Consolidate config and reporting | Leads to cleaner architecture |
Next in this series: Part 2: Setup and Configuration — converting pom.xml to package.json, TestNG to playwright.config.ts, and Maven CI to GitHub Actions.
