PluginBench
Skill
Pass
Audit score 90

playwright-expert

jeffallan/claude-skills

E2E testing specialist with deep expertise in Playwright for robust, maintainable browser automation.

What is playwright-expert?

Use when writing E2E tests with Playwright, setting up test infrastructure, or debugging flaky browser tests. This skill provides guidance on test scripts, page objects, fixtures, reporters, CI integration, API mocking, and visual regression testing.

  • Write maintainable E2E tests using Page Object Model pattern
  • Configure Playwright with proper settings and fixtures
  • Debug flaky tests using trace viewer and proper wait strategies
  • Implement role-based selectors and auto-waiting for resilient tests
  • Set up API mocking and route interception
  • Integrate tests into CI/CD pipelines with parallel execution

How to install playwright-expert

npx skills add https://github.com/jeffallan/claude-skills --skill playwright-expert
Claude Code
Cursor
Windsurf
Cline

How to use playwright-expert

  1. 1.Analyze the user flows and scenarios you need to test
  2. 2.Set up playwright.config.ts with trace and screenshot options
  3. 3.Create Page Object classes to encapsulate UI interactions
  4. 4.Write test files using role-based selectors and auto-waiting
  5. 5.Run tests with retries enabled to capture traces on failure
  6. 6.Use trace viewer to inspect timeline and identify flakiness
  7. 7.Replace arbitrary timeouts with proper wait conditions
  8. 8.Run tests in parallel to verify stability across multiple executions

Use cases

Good for
  • Writing login flow tests with proper error handling and assertions
  • Creating page objects to abstract UI interactions and reduce test brittleness
  • Debugging intermittent test failures using trace viewer and screenshots
  • Setting up visual regression testing for UI components
  • Configuring Playwright to run tests in parallel with proper isolation
Who it's for
  • QA engineers writing E2E tests
  • Frontend developers automating browser testing
  • Test infrastructure specialists setting up CI/CD pipelines
  • Teams debugging flaky or brittle test suites

playwright-expert FAQ

When should I use role-based selectors vs CSS class selectors?

Always prefer role-based selectors like getByRole() and getByLabel() because they are resilient to styling changes. Avoid CSS class selectors as they break when classes are refactored.

How do I fix flaky tests?

Enable traces and screenshots in playwright.config.ts, re-run with retries to capture failures, open the trace viewer to inspect the timeline, then replace arbitrary waitForTimeout() calls with proper waits like waitFor({ state: 'visible' }).

What is the Page Object Model and why should I use it?

POM encapsulates page elements and interactions in reusable classes, making tests more maintainable and less brittle. It reduces duplication and makes selector changes easier to manage.

Should I share state between tests?

No. Keep tests independent by using beforeEach hooks to set up fresh state for each test. Shared state causes tests to fail unpredictably and makes debugging difficult.

How do I verify my test fixes are stable?

Run the test multiple times using npx playwright test --repeat-each=10 to confirm it passes consistently before considering it fixed.

Full instructions (SKILL.md)

Source of truth, from jeffallan/claude-skills.


name: playwright-expert description: "Use when writing E2E tests with Playwright, setting up test infrastructure, or debugging flaky browser tests. Invoke to write test scripts, create page objects, configure test fixtures, set up reporters, add CI integration, implement API mocking, or perform visual regression testing. Trigger terms: Playwright, E2E test, end-to-end, browser testing, automation, UI testing, visual testing, Page Object Model, test flakiness." license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: quality triggers: Playwright, E2E test, end-to-end, browser testing, automation, UI testing, visual testing role: specialist scope: testing output-format: code related-skills: test-master, react-expert, devops-engineer

Playwright Expert

E2E testing specialist with deep expertise in Playwright for robust, maintainable browser automation.

Core Workflow

  1. Analyze requirements - Identify user flows to test
  2. Setup - Configure Playwright with proper settings
  3. Write tests - Use POM pattern, proper selectors, auto-waiting
  4. Debug - Run test → check trace → identify issue → fix → verify fix
  5. Integrate - Add to CI/CD pipeline

Reference Guide

Load detailed guidance based on context:

TopicReferenceLoad When
Selectorsreferences/selectors-locators.mdWriting selectors, locator priority
Page Objectsreferences/page-object-model.mdPOM patterns, fixtures
API Mockingreferences/api-mocking.mdRoute interception, mocking
Configurationreferences/configuration.mdplaywright.config.ts setup
Debuggingreferences/debugging-flaky.mdFlaky tests, trace viewer

Constraints

MUST DO

  • Use role-based selectors when possible
  • Leverage auto-waiting (don't add arbitrary timeouts)
  • Keep tests independent (no shared state)
  • Use Page Object Model for maintainability
  • Enable traces/screenshots for debugging
  • Run tests in parallel

MUST NOT DO

  • Use waitForTimeout() (use proper waits)
  • Rely on CSS class selectors (brittle)
  • Share state between tests
  • Ignore flaky tests
  • Use first(), nth() without good reason

Code Examples

Selector: Role-based (correct) vs CSS class (brittle)

// ✅ Role-based selector — resilient to styling changes
await page.getByRole('button', { name: 'Submit' }).click();
await page.getByLabel('Email address').fill('user@example.com');

// ❌ CSS class selector — breaks on refactor
await page.locator('.btn-primary.submit-btn').click();
await page.locator('.email-input').fill('user@example.com');

Page Object Model + Test File

// pages/LoginPage.ts
import { type Page, type Locator } from '@playwright/test';

export class LoginPage {
  readonly page: Page;
  readonly emailInput: Locator;
  readonly passwordInput: Locator;
  readonly submitButton: Locator;
  readonly errorMessage: Locator;

  constructor(page: Page) {
    this.page = page;
    this.emailInput = page.getByLabel('Email address');
    this.passwordInput = page.getByLabel('Password');
    this.submitButton = page.getByRole('button', { name: 'Sign in' });
    this.errorMessage = page.getByRole('alert');
  }

  async goto() {
    await this.page.goto('/login');
  }

  async login(email: string, password: string) {
    await this.emailInput.fill(email);
    await this.passwordInput.fill(password);
    await this.submitButton.click();
  }
}
// tests/login.spec.ts
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';

test.describe('Login', () => {
  let loginPage: LoginPage;

  test.beforeEach(async ({ page }) => {
    loginPage = new LoginPage(page);
    await loginPage.goto();
  });

  test('successful login redirects to dashboard', async ({ page }) => {
    await loginPage.login('user@example.com', 'correct-password');
    await expect(page).toHaveURL('/dashboard');
  });

  test('invalid credentials shows error', async () => {
    await loginPage.login('user@example.com', 'wrong-password');
    await expect(loginPage.errorMessage).toBeVisible();
    await expect(loginPage.errorMessage).toContainText('Invalid credentials');
  });
});

Debugging Workflow for Flaky Tests

// 1. Run failing test with trace enabled
// playwright.config.ts
use: {
  trace: 'on-first-retry',
  screenshot: 'only-on-failure',
}

// 2. Re-run with retries to capture trace
// npx playwright test --retries=2

// 3. Open trace viewer to inspect timeline
// npx playwright show-trace test-results/.../trace.zip

// 4. Common fix — replace arbitrary timeout with proper wait
// ❌ Flaky
await page.waitForTimeout(2000);
await page.getByRole('button', { name: 'Save' }).click();

// ✅ Reliable — waits for element state
await page.getByRole('button', { name: 'Save' }).waitFor({ state: 'visible' });
await page.getByRole('button', { name: 'Save' }).click();

// 5. Verify fix — run test 10x to confirm stability
// npx playwright test --repeat-each=10

Output Templates

When implementing Playwright tests, provide:

  1. Page Object classes
  2. Test files with proper assertions
  3. Fixture setup if needed
  4. Configuration recommendations

Knowledge Reference

Playwright, Page Object Model, auto-waiting, locators, fixtures, API mocking, trace viewer, visual comparisons, parallel execution, CI/CD integration

Documentation