| created | "2025-12-16T00:00:00.000Z" |
| modified | "2026-05-09T00:00:00.000Z" |
| reviewed | "2025-12-16T00:00:00.000Z" |
| name | playwright-testing |
| description | Playwright E2E testing — cross-browser, visual regression, API testing, mobile emulation. Use when writing E2E tests or setting up automated UI testing for web apps. |
| user-invocable | false |
| allowed-tools | Glob, Grep, Read, Bash, Edit, Write, TodoWrite, WebFetch, WebSearch, BashOutput, KillShell |
Playwright Testing
Playwright is a modern end-to-end testing framework for web applications. It provides reliable, fast, and cross-browser testing with excellent developer experience.
When to Use This Skill
| Use this skill when... | Use another skill instead when... |
|---|
| Writing E2E browser tests | Writing unit tests (use vitest-testing) |
| Testing across Chromium, Firefox, WebKit | Testing Python code (use python-testing) |
| Setting up visual regression testing | Analyzing test quality (use test-quality-analysis) |
| Mocking network requests in E2E tests | Generating property-based tests (use property-based-testing) |
| Testing mobile viewports | Testing API contracts only (use api-testing) |
Core Expertise
- Cross-browser: Test on Chromium, Firefox, WebKit (Safari)
- Reliable: Auto-wait, auto-retry, no flaky tests
- Fast: Parallel execution, browser context isolation
- Modern: TypeScript-first, async/await, auto-complete
- Multi-platform: Windows, macOS, Linux
Installation
bun create playwright
bun add --dev @playwright/test
bunx playwright install
bunx playwright install --with-deps
bunx playwright --version
Configuration (playwright.config.ts)
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
timeout: 30000,
use: {
baseURL: 'http://localhost:3000',
trace: 'on-first-retry',
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
});
Essential Commands
bunx playwright test
bunx playwright test tests/login.spec.ts
bunx playwright test --headed
bunx playwright test --debug
bunx playwright test --project=chromium
bunx playwright test --ui
bunx playwright codegen http://localhost:3000
bunx playwright show-report
bunx playwright show-trace trace.zip
bunx playwright test --update-snapshots
Writing Tests
Basic Test Structure
import { test, expect } from '@playwright/test';
test('basic test', async ({ page }) => {
await page.goto('https://example.com');
await expect(page).toHaveTitle(/Example/);
});
test.describe('login flow', () => {
test('should login successfully', async ({ page }) => {
await page.goto('/login');
await page.fill('input[name="email"]', 'user@example.com');
await page.fill('input[name="password"]', 'password123');
await page.click('button[type="submit"]');
await expect(page).toHaveURL('/dashboard');
});
});
Selectors and Locators
await page.getByText('Sign in').click();
await page.getByRole('button', { name: 'Submit' }).click();
await page.getByLabel('Email').fill('user@example.com');
await page.getByPlaceholder('Enter your name').fill('John');
await page.getByTestId('login-button').click();
await page.locator('.button-primary').click();
await page.locator('xpath=//button[text()="Submit"]').click();
await page.locator('.card').filter({ hasText: 'Product' }).getByRole('button').click();
Key Assertions
| Assertion | Description |
|---|
toHaveTitle(title) | Page title |
toHaveURL(url) | Page URL |
toBeVisible() | Element visible |
toBeEnabled() | Element enabled |
toHaveText(text) | Element text |
toContainText(text) | Partial text |
toHaveAttribute(name, value) | Attribute value |
toHaveClass(class) | CSS class |
toHaveValue(value) | Input value |
toBeEmpty() | Empty input |
toHaveCount(n) | Element count |
not.toBeDisabled() | Negation |
Agentic Optimizations
| Context | Command |
|---|
| Quick test | bunx playwright test --reporter=line --bail |
| CI test | bunx playwright test --reporter=github |
| Single browser | bunx playwright test --project=chromium --reporter=line |
| Debug failing | bunx playwright test --trace on --reporter=line |
| Headed debug | bunx playwright test --headed --debug |
For detailed examples, advanced patterns, and best practices, see REFERENCE.md.
References