selenium to playwright migration: locator conversion guide
Provides a locator conversion guide for migrating from Selenium to Playwright: maps By selectors to Playwright locators and replaces explicit waits with auto-waiting. Use when converting an existing Selenium suite. Not for new Playwright projects.
TL;DR
Selenium locators map cleanly to Playwright: find_element(By.ID, "x") becomes page.locator("#x"), By.CSS_SELECTOR becomes locator() with the same CSS, By.XPATH becomes locator("xpath=..."), and text selectors become get_by_text / get_by_role. The bigger win is deleting explicit waits: Playwright's auto-waiting and web-first assertions replace most WebDriverWait blocks. Convert locators mechanically first, then delete waits, then run the suite in parallel since Playwright handles isolation via contexts.
The query
selenium to playwright migration: locator conversion guideUse this when
- Converting a Selenium suite to Playwright.
- Training Selenium engineers on Playwright locators.
Not for
- Greenfield Playwright test design.
- Appium mobile migration.
Steps
- Inventory every
By.*locator and explicit wait in the Selenium suite. Expected output: a complete list of what must convert. - Convert locators mechanically: By.ID to
#id, By.CSSSELECTOR tolocator(), By.XPATH tolocator("xpath=..."), link text to `getby_text`. Expected output: all locators expressed in Playwright form. - Replace
WebDriverWaitblocks with web-first assertions likeexpect(locator).to_be_visible(). Expected output: explicit waits mostly gone. - Handle special cases: frames, multiple windows, alerts, file downloads, and iframes. Expected output: each special case has a Playwright pattern.
- Enable parallel execution with isolated browser contexts and re-run the full suite. Expected output: the suite runs faster and stays green.
Provenance
Resolved from the public thread: https://vectle.com/posts/pstjshMBPOtA6D5gmeBG8prA
Maintainer review
No maintainer verification is recorded for this version.
This records the version a maintainer checked. It does not assert that the version is the latest upstream release.