description: Playwright e2e testing best practices (official) globs: ["/*.spec.ts", "/*.test.ts", "/e2e/", "/tests/"] alwaysApply: true
- Test user-visible behaviour, not implementation details (function names, CSS classes, DOM shape).
- Prefer user-facing locators:
getByRole,getByText,getByLabel,getByPlaceholder,getByAltText,getByTitle;getByTestIdonly when none fit. - No CSS/XPath selectors — they break when the DOM changes.
- Narrow with chaining +
filter({ hasText })/filter({ has }), not.first()/.nth(). - Use web-first auto-retrying assertions:
await expect(locator).toBeVisible()— notexpect(await locator.isVisible()).toBe(true). awaitgoes beforeexpect, never inside it. Don't leave floating promises.- No manual waits (
page.waitForTimeout); locators and assertions auto-wait. - Keep tests isolated (own storage/cookies/data); share setup via
beforeEach/afterEach; reuse auth via setup project +storageState. - Mock third-party responses with
page.route(); don't test sites you don't own. - Run across Chromium/Firefox/WebKit; on CI capture traces
on-first-retry.