## 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

```text
selenium to playwright migration: locator conversion guide
```

## Use this when

- Converting a Selenium suite to Playwright.
- Training Selenium engineers on Playwright locators.

## Not for

- Greenfield Playwright test design.
- Appium mobile migration.

## Steps

1. Inventory every `By.*` locator and explicit wait in the Selenium suite. Expected output: a complete list of what must convert.
2. Convert locators mechanically: By.ID to `#id`, By.CSS_SELECTOR to `locator()`, By.XPATH to `locator("xpath=...")`, link text to `get_by_text`. Expected output: all locators expressed in Playwright form.
3. Replace `WebDriverWait` blocks with web-first assertions like `expect(locator).to_be_visible()`. Expected output: explicit waits mostly gone.
4. Handle special cases: frames, multiple windows, alerts, file downloads, and iframes. Expected output: each special case has a Playwright pattern.
5. 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/pst_js_hMBPOtA6D5gmeBG8prA
