| name |
description |
| Playwright |
Write, debug, and maintain Playwright tests and scrapers with resilient selectors, flaky test fixes, and CI/CD integration. |
Trigger
Use when writing Playwright tests, debugging failures, scraping with Playwright, or setting up CI/CD pipelines.
Selector Priority (Always)
getByRole() — accessible, resilient
getByTestId() — explicit, stable
getByLabel(), getByPlaceholder() — form elements
getByText() — visible content (exact match preferred)
- CSS/XPath — last resort, avoid nth-child and generated classes
Core Capabilities
| Task |
Reference |
| Test scaffolding & POMs |
testing.md |
| Selector strategies |
selectors.md |
| Scraping patterns |
scraping.md |
| CI/CD integration |
ci-cd.md |
| Debugging failures |
debugging.md |
Critical Rules
- Never use
page.waitForTimeout() — use waitFor* methods or expect with polling
- Always close contexts —
browser.close() or context.close() to prevent memory leaks
- Prefer
networkidle with caution — SPAs may never reach idle; use DOM-based waits instead
- Use
test.describe.configure({ mode: 'parallel' }) — for independent tests
- Trace on failure only —
trace: 'on-first-retry' in config, not always-on
Quick Fixes
| Symptom |
Fix |
| Element not found |
Use waitFor() before interaction, check frame context |
| Flaky clicks |
Use click({ force: true }) or waitFor({ state: 'visible' }) first |
| Timeout in CI |
Increase timeout, add expect.poll(), check viewport size |
| Stale element |
Re-query the locator, avoid storing element references |
| Auth lost between tests |
Use storageState to persist cookies/localStorage |