playwright-standard
Comprehensive, opinionated guidance for Playwright test development. Use when writing E2E, API, component, or visual tests, debugging failures, implementing Page Object Model, or configuring CI/CD. Includes "Golden Rules" for resilient tests and provides on-demand reference for specialized scenarios (Electron, WebSockets, mobile, security audits).
Playwright Standard
This skill combines battle-tested coding standards with industrial-scale infrastructure guidance. It is designed to keep agents on the "Golden Path" of modern Playwright development while providing deep reference for niche environments.
Golden Rules (Mandatory)
getByRole()over CSS/XPath — Resilient to markup changes, mirrors how users see the page.- Never
page.waitForTimeout()— Useexpect(locator).toBeVisible()orpage.waitForURL(). - Web-first assertions —
expect(locator)auto-retries;expect(await locator.textContent())does not. - Isolate every test — Every test must run independently in any order (no shared state).
- Fixtures over globals — Share state via
test.extend(), not module-level variables. baseURLin config — ZERO hardcoded URLs in test files.- Auth: Reuse storage state — Use
browserContext.storageStateto avoid UI login in every test. - Network: Mock third-party only — Never mock your own app; mock external APIs, gateways, and emails.
- Traces:
'on-first-retry'— High-fidelity debugging without CI performance penalties. - One behavior per test — Avoid "mega-tests": keep focus narrow and assertions meaningful.
Quality Standards
Locators Priority
- Role:
page.getByRole('button', { name: 'Submit' }) - Label:
page.getByLabel('User Name') - Placeholder:
page.getByPlaceholder('Search...') - Text:
page.getByText('Success') - TestID:
page.getByTestId('submit-btn')(Last resort)
Synchronization
- Do:
await expect(locator).toBeVisible() - Avoid:
await page.waitForSelector('.btn') - Avoid:
await page.waitForLoadState('networkidle')(Flaky on high-latency networks)
Specialized References (Load On-Demand)
For infrastructure, scale, or niche environments, read the relevant reference file:
| Scenario | Reference File |
|---|---|
| CI/CD, Sharding, Docker | infrastructure.md |
| Electron, WebSockets, Canvas | advanced-scenarios.md |
| Visual, Accessibility, API | advanced-scenarios.md |
Example: Fixture-based Isolation
See fixtures.ts for the recommended pattern for sharing state without global variables.