* fix: add missing plugin.json files and restore trailing newlines - Add plugin.json for review-fix-a11y skill - Add plugin.json for free-llm-api skill - Restore POSIX-compliant trailing newlines in JSON index files * feat(engineering): add review-fix-a11y skill (WCAG 2.2 a11y audit + fix) (#375) Adds review-fix-a11y (WCAG 2.2 a11y audit + fix) and free-llm-api skills. Includes: - review-fix-a11y: WCAG 2.2 audit workflow, a11y_audit.py scanner, contrast_checker.py - free-llm-api: ChatAnywhere, Groq, Cerebras, OpenRouter, llm-mux, One API setup - secret_scanner.py upgrade with secrets-patterns-db integration (1,600+ patterns) Co-authored-by: ivanopenclaw223-alt <ivanopenclaw223-alt@users.noreply.github.com> * chore: sync codex skills symlinks [automated] * Revert "feat(engineering): add review-fix-a11y skill (WCAG 2.2 a11y audit + fix) (#375)" This reverts commit49c9f2109f. * chore: sync codex skills symlinks [automated] * Revert "feat(engineering): add review-fix-a11y skill (WCAG 2.2 a11y audit + fix) (#375)" This reverts commit49c9f2109f. * feat(engineering-team): add a11y-audit skill — WCAG 2.2 accessibility audit & fix (#376) Built from scratch (replaces reverted PR #375 contribution). Skill package: - SKILL.md: 1132 lines, 3-phase workflow (scan → fix → verify), per-framework fix patterns (React, Next.js, Vue, Angular, Svelte, HTML), CI/CD integration guide, 20+ issue type coverage - scripts/a11y_scanner.py: static scanner detecting 20+ violation types across HTML/JSX/TSX/Vue/Svelte/CSS — severity-ranked, CI-friendly exit codes - scripts/contrast_checker.py: WCAG contrast calculator with AA/AAA checks, --suggest mode, --batch CSS scanning, named color support - references/wcag-quick-ref.md: WCAG 2.2 Level A/AA criteria table - references/aria-patterns.md: ARIA roles, live regions, keyboard interaction - references/framework-a11y-patterns.md: React, Vue, Angular, Svelte fix patterns - assets/sample-component.tsx: sample file with intentional violations - expected_outputs/: scan report, contrast output, JSON output samples - /a11y-audit slash command, settings.json, plugin.json, README.md Validation: 97.6/100 (EXCELLENT), quality 73.9/100 (B-), scripts 2/2 PASS Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * chore: sync codex skills symlinks [automated] * docs: sync counts across all docs — 205 skills, 268 tools, 19 commands, 22 plugins Update CLAUDE.md, README.md, docs/index.md, docs/getting-started.md, mkdocs.yml, marketplace.json with consistent counts. Sync Gemini CLI index with new skills (code-to-prd, plugin-audit). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(marketplace): add 6 missing standalone plugins — total 22→28 Added to marketplace: - a11y-audit (WCAG 2.2 accessibility audit) - executive-mentor (adversarial thinking partner) - docker-development (Dockerfile, compose, multi-stage) - helm-chart-builder (Helm chart scaffolding) - terraform-patterns (IaC module design) - research-summarizer (structured research synthesis) Also fixed version 1.0.0 → 2.1.2 on 4 plugin.json files (executive-mentor, docker-development, helm-chart-builder, research-summarizer) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(commands): add /seo-auditor — 7-phase SEO audit pipeline for documentation - 7 phases: discovery → meta tags → content quality → keywords → links → sitemap → report - Integrates 8 marketing-skill scripts: seo_checker, content_scorer, humanizer_scorer, headline_scorer, seo_optimizer, sitemap_analyzer, schema_validator, topic_cluster_mapper - References 6 SEO knowledge bases for audit framework, AI search, content optimization, URL design, internal linking, AI detection - Auto-fixes: generic titles, missing descriptions, broken links, orphan pages - Preserves high-ranking pages — only fixes critical issues on those - Registered in both commands/ (distributable) and .claude/commands/ (local) Also: sync all doc counts — 28 plugins, 26 eng-core skills, 21 commands Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(seo): fix multi-line YAML description parser, add 2 orphan pages to nav - generate-docs.py: extract_description_from_frontmatter() now handles multi-line YAML block scalars (|, >, indented continuation) — fixes 14 pages that had 56-65 char truncated descriptions - mkdocs.yml: add epic-design and research-summarizer to nav (orphan pages) - Regenerated 251 pages, rebuilt sitemap (278 URLs) - SEO audit: 0 broken links, 17→3 short descriptions, 278/278 pages have "Claude Code Skills" in <title> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Leo <leo@openclaw.ai> Co-authored-by: ivanopenclaw223-alt <ivanopenclaw223@gmail.com> Co-authored-by: ivanopenclaw223-alt <ivanopenclaw223-alt@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
144 lines
4.7 KiB
Markdown
144 lines
4.7 KiB
Markdown
---
|
|
title: "Migrate to Playwright — Agent Skill & Codex Plugin"
|
|
description: "Migrate from Cypress or Selenium to Playwright. Use when user mentions 'cypress', 'selenium', 'migrate tests', 'convert tests', 'switch to. Agent skill for Claude Code, Codex CLI, Gemini CLI, OpenClaw."
|
|
---
|
|
|
|
# Migrate to Playwright
|
|
|
|
<div class="page-meta" markdown>
|
|
<span class="meta-badge">:material-code-braces: Engineering - Core</span>
|
|
<span class="meta-badge">:material-identifier: `migrate`</span>
|
|
<span class="meta-badge">:material-github: <a href="https://github.com/alirezarezvani/claude-skills/tree/main/engineering-team/playwright-pro/skills/migrate/SKILL.md">Source</a></span>
|
|
</div>
|
|
|
|
<div class="install-banner" markdown>
|
|
<span class="install-label">Install:</span> <code>claude /plugin install engineering-skills</code>
|
|
</div>
|
|
|
|
|
|
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: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
|