Production-grade Playwright testing toolkit. Use when the user mentions Playwright tests, end-to-end testing, browser automation, fixing flaky tests, test migration, CI/CD testing, or test suites. Generate tests, fix flaky failures, migrate from Cypress/Selenium, sync with TestRail, run on BrowserStack. 55 templates, 3 agents, smart reporting.
Production-grade Playwright testing toolkit for AI coding agents.
Provide a production-grade Playwright testing toolkit for generating, reviewing, fixing, migrating, and reporting end-to-end browser tests with CI/CD integration and cross-browser support.
Apply when the user requests:
Do NOT trigger for:
senior-qawebapp-testingnode --version to verifynpx playwright --versionnpm init playwright@latestTESTRAIL_URL, TESTRAIL_USER, TESTRAIL_API_KEY env varsBROWSERSTACK_USERNAME, BROWSERSTACK_ACCESS_KEY env vars/pw:init to scaffold Playwright config, CI pipeline, and a first smoke test for the current framework/pw:generate "<user story or URL>" to create test files using the 55 available templates/pw:review after generating; it catches locator anti-patterns, missing assertions, and coverage gaps automatically/pw:fix <test-file> to diagnose and repair flaky or failing tests; it replaces waitForTimeout with web-first assertionsnpx playwright test to confirm no regressions introduced by the fix2 in CI, 0 locally; set traces to 'on-first-retry'Results are printed to the user:
### Playwright Operation: <command>
**Files affected**: <list>
**Issues found** (for /pw:review):
| # | File | Line | Issue | Fix applied |
|---|------|------|-------|-------------|
| 1 | <file> | <line> | <anti-pattern> | <fix> |
**Test results** (for /pw:fix):
- Before: FAIL (<error>)
- After: PASS
**Next step**: <action>
/pw:review after /pw:generate before committing — catches anti-patterns automatically/pw:fix to confirm no regressionsgetByRole() as the primary locator — it is resilient to markup changesexpect(locator).toBeVisible()) — never waitForTimeout()page.waitForTimeout() — always replace with a web-first assertionbaseURL in Playwright config/pw:generate "As a user I can log in with email and password"
# → Creates tests/auth/login.spec.ts using auth template
/pw:review tests/auth/login.spec.ts
# → Flags: page.locator('input[type=password]') → replaced with getByLabel('Password')
npx playwright test tests/auth/login.spec.ts --headed
# → PASS
// Bad: CSS selector, waitForTimeout, hardcoded URL
await page.goto('http://localhost:3000/login');
await page.locator('input[type=password]').fill('secret');
await page.waitForTimeout(2000);
await page.click('.btn-submit');
Why this is bad: Hardcoded URL breaks in CI. CSS selector breaks on markup change.
waitForTimeoutcauses flakiness. No web-first assertion to confirm navigation succeeded.
When installed as a Claude Code plugin, these are available as /pw: commands:
| Command | What it does |
|---|---|
/pw:init | Set up Playwright — detects framework, generates config, CI, first test |
/pw:generate <spec> | Generate tests from user story, URL, or component |
/pw:review | Review tests for anti-patterns and coverage gaps |
/pw:fix <test> | Diagnose and fix failing or flaky tests |
/pw:migrate | Migrate from Cypress or Selenium to Playwright |
/pw:coverage | Analyze what's tested vs. what's missing |
/pw:testrail | Sync with TestRail — read cases, push results |
/pw:browserstack | Run on BrowserStack, pull cross-browser reports |
/pw:report | Generate test report in your preferred format |
The recommended sequence for most projects:
1. /pw:init → scaffolds config, CI pipeline, and a first smoke test
2. /pw:generate → generates tests from your spec or URL
3. /pw:review → validates quality and flags anti-patterns ← always run after generate
4. /pw:fix <test> → diagnoses and repairs any failing/flaky tests ← run when CI turns red
Validation checkpoints:
/pw:generate — always run /pw:review before committing; it catches locator anti-patterns and missing assertions automatically./pw:fix — re-run the full suite locally (npx playwright test) to confirm the fix doesn't introduce regressions./pw:migrate — run /pw:coverage to confirm parity with the old suite before decommissioning Cypress/Selenium tests.# 1. Generate tests from a user story
/pw:generate "As a user I can log in with email and password"
# Generated: tests/auth/login.spec.ts
# → Playwright Pro creates the file using the auth template.
# 2. Review the generated tests
/pw:review tests/auth/login.spec.ts
# → Flags: one test used page.locator('input[type=password]') — suggests getByLabel('Password')
# → Fix applied automatically.
# 3. Run locally to confirm
npx playwright test tests/auth/login.spec.ts --headed
# 4. If a test is flaky in CI, diagnose it
/pw:fix tests/auth/login.spec.ts
# → Identifies missing web-first assertion; replaces waitForTimeout(2000) with expect(locator).toBeVisible()
getByRole() over CSS/XPath — resilient to markup changespage.waitForTimeout() — use web-first assertionsexpect(locator) auto-retries; expect(await locator.textContent()) does notbaseURL in config — zero hardcoded URLs2 in CI, 0 locally'on-first-retry' — rich debugging without slowdowntest.extend() for shared state1. getByRole() — buttons, links, headings, form elements
2. getByLabel() — form fields with labels
3. getByText() — non-interactive text
4. getByPlaceholder() — inputs with placeholder
5. getByTestId() — when no semantic option exists
6. page.locator() — CSS/XPath as last resort
export TESTRAIL_URL="https://your-instance.testrail.io"
export TESTRAIL_USER="[email protected]"
export TESTRAIL_API_KEY="your-api-key"
export BROWSERSTACK_USERNAME="your-username"
export BROWSERSTACK_ACCESS_KEY="your-access-key"
See reference/ directory for:
golden-rules.md — The 10 non-negotiable ruleslocators.md — Complete locator priority with cheat sheetassertions.md — Web-first assertions referencefixtures.md — Custom fixtures and storageState patternscommon-pitfalls.md — Top 10 mistakes and fixesflaky-tests.md — Diagnosis commands and quick fixesSee templates/README.md for the full template index.