Trigger
Use when writing Playwright tests, debugging failures, scraping with Playwright, or setting up CI/CD pipelines.
Selector Priority (Always)
getByRole()— accessible, resilientgetByTestId()— explicit, stablegetByLabel(),getByPlaceholder()— form elementsgetByText()— 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()— usewaitFor*methods orexpectwith polling - Always close contexts —
browser.close()orcontext.close()to prevent memory leaks - Prefer
networkidlewith 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 |