migrate — Claude Code skill: migrate tests
Moves Cypress or Selenium tests to Playwright. Use it when an existing test suite needs file-by-file conversion and checks after each change.
/plugin marketplace add alirezarezvani/claude-skills
/plugin install pw@claude-code-skillsWhat migrate does
The skill detects the source framework from project files and dependencies, estimates the migration scope, and converts tests to Playwright. It handles Cypress and Selenium, including Selenium tests written in Python. You can pass from cypress, from selenium, or a path to one test file.
During conversion, it maps navigation, locators, clicks, text input, assertions, request interception, and waits to Playwright APIs. Cypress custom commands become Playwright fixtures or helper functions. Selenium page objects keep their structure while their API is updated. Each converted file is checked with npx playwright test --reporter=list.
Run /pw:pw-init first when Playwright is not configured. Larger suites can use /batch; removing old dependencies and config files requires user approval. Install this skill when you want a guided migration with a check after each file.
What it helps with
- move Cypress tests to Playwright
- convert Selenium tests written in Python
- estimate the size of a test migration
- replace brittle selectors with Playwright locators
- check each converted test file
Example prompts for the agent
- Migrate this Cypress test suite to Playwright and start with a migration assessment.
- Convert `tests/login.cy.ts` to Playwright, then run `npx playwright test --reporter=list`.
- Check the Playwright setup and migrate the tests `from selenium`.
How to install migrate
1Plugin marketplace
/plugin marketplace add alirezarezvani/claude-skills/plugin install pw@claude-code-skillsThis installs the whole pw plugin with all its skills
2Skills CLI (Vercel)
npx skills add alirezarezvani/claude-skills --skill migrate -a claude-code3Manually: put the files in place
~/.claude/skills/migrate/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/migrate/
Manually: put the files in place
.agents/skills/migrate/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/migrate/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install alirezarezvani/claude-skills migrate2Manually: put the files in place
.github/skills/migrate/SKILL.mdPlatform CLI
gemini skills install https://github.com/alirezarezvani/claude-skills --path engineering-team/playwright-pro/skills/migrateManually: put the files in place
.devin/skills/migrate/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set349
The whole set →Similar
Questions about migrate
How do I install migrate in Claude Code?
Add the marketplace with /plugin marketplace add alirezarezvani/claude-skills, then install it with /plugin install pw@claude-code-skills. You can also use npx skills add alirezarezvani/claude-skills --skill migrate -a claude-code or ~/.claude/skills/migrate/SKILL.md.
What does the migrate skill do?
It moves Cypress or Selenium tests to Playwright, updates APIs and locators, and checks each converted file with a Playwright test run.
What should I prepare before migration?
Run /pw:pw-init when Playwright is not configured. For large suites, the skill uses /batch; removing old dependencies and config files waits for user approval.
Source text
SKILL.md · MIT
---
name: "migrate"
description: >-
Migrate from Cypress or Selenium to Playwright. Use when user mentions
"cypress", "selenium", "migrate tests", "convert tests", "switch to
playwright", "move from cypress", or "replace selenium".
---
# Migrate to Playwright
Interactive migration from Cypress or Selenium to Playwright with file-by-file conversion.
## Input
`$ARGUMENTS` can be:
- `"from cypress"` — migrate Cypress test suite
- `"from selenium"` — migrate Selenium/WebDriver tests
- A file path: convert a specific test file
- Empty: auto-detect source framework
## Steps
### 1. Detect Source Framework
Use `Explore` subagent to scan:
- `cypress/` directory or `cypress.config.ts` → Cypress
- `selenium`, `webdriver` in `package.json` deps → Selenium
- `.py` test files with `selenium` imports → Selenium (Python)
### 2. Assess Migration Scope
Count files and categorize:
```
Migration Assessment:
- Total test files: X
- Cypress custom commands: Y
- Cypress fixtures: Z
- Estimated effort: [small|medium|large]
```
| Size | Files | Approach |
|---|---|---|
| Small (1-10) | Convert sequentially | Direct conversion |
| Medium (11-30) | Batch in groups of 5 | Use sub-agents |
| Large (31+) | Use `/batch` | Parallel conversion with `/batch` |
### 3. Set Up Playwright (If Not Present)
Run `/pw:pw-init` first if Playwright isn't configured.
### 4. Convert Files
For each file, apply the appropriate mapping:
#### Cypress → Playwright
Load `cypress-mapping.md` for complete reference.
Key translations:
```
cy.visit(url) → page.goto(url)
cy.get(selector) → page.locator(selector) or page.getByRole(...)
cy.contains(text) → page.getByText(text)
cy.find(selector) → locator.locator(selector)
cy.click() → locator.click()
cy.type(text) → locator.fill(text)
cy.should('be.visible') → expect(locator).toBeVisible()
cy.should('have.text') → expect(locator).toHaveText(text)
cy.intercept() → page.route()
cy.wait('@alias') → page.waitForResponse()
cy.fixture() → JSON import or test data file
```
**Cypress custom commands** → Playwright fixtures or helper functions
**Cypress plugins** → Playwright config or fixtures
**`before`/`beforeEach`** → `test.beforeAll()` / `test.beforeEach()`
#### Selenium → Playwright
Load `selenium-mapping.md` for complete reference.
Key translations:
```
driver.get(url) → page.goto(url)
driver.findElement(By.id('x')) → page.locator('#x') or page.getByTestId('x')
driver.findElement(By.css('.x')) → page.locator('.x') or page.getByRole(...)
element.click() → locator.click()
element.sendKeys(text) → locator.fill(text)
element.getText() → locator.textContent()
WebDriverWait + ExpectedConditions → expect(locator).toBeVisible()
driver.switchTo().frame() → page.frameLocator()
Actions → locator.hover(), locator.dragTo()
```
### 5. Upgrade Locators
During conversion, upgrade selectors to Playwright best practices:
- `#id` → `getByTestId()` or `getByRole()`
- `.class` → `getByRole()` or `getByText()`
- `[data-testid]` → `getByTestId()`
- XPath → role-based locators
### 6. Convert Custom Commands / Utilities
- Cypress custom commands → Playwright custom fixtures via `test.extend()`
- Selenium page objects → Playwright page objects (keep structure, update API)
- Shared helpers → TypeScript utility functions
### 7. Verify Each Converted File
After converting each file:
```bash
npx playwright test <converted-file> --reporter=list
```
Fix any compilation or runtime errors before moving to the next file.
### 8. Clean Up
After all files are converted:
- Remove Cypress/Selenium dependencies from `package.json`
- Remove old config files (`cypress.config.ts`, etc.)
- Update CI workflow to use Playwright
- Update README with new test commands
Ask user before deleting anything.
## Output
- Conversion summary: files converted, total tests migrated
- Any tests that couldn't be auto-converted (manual intervention needed)
- Updated CI config
- Before/after comparison of test run results
© Alireza Rezvani · MIT · alirezarezvani/claude-skills