← Back to list
🛠️

playwright-expert Checked

Use when writing E2E tests with Playwright, setting up test infrastructure, or debugging flaky br…
🛠️ Developer Tools skills By Jeffallan Version v1.0.0 Added 2026-09-07 Updated 2026-09-07 Source ↗
9.0Overall rating
2Views
10Downloads
11.3kStars

Installation

🤖 Install via AI

Copy the prompt below and send it to your AI assistant (e.g. Claude Code) — it will follow the instructions and install automatically.

Install the "playwright-expert" skill by following the instructions at https://skill123.me/install/playwright-expert.
⌨️ Command line install

Run in your terminal — downloads and installs to ~/.claude/skills/.

curl -fsSL https://skill123.me/install/playwright-expert.sh | bash
📦 Download ZIP

Download the zip and extract it into your skills directory (e.g. ~/.claude/skills/), then restart your session.

⬇ Download v1.0.0 · 9 KB
📊 Static rating
9.0/10
Trigger
8.0
Structure
10.0
Workflow
8.0
Content
9.0
Engineering
10.0
Security
10.0

Six-dimension rubric with reviewer rationale.

View scorecard ↓
🛡 Dynamic test
—

Not live-tested yet — this skill is rated on static analysis only.

About this skill

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.

Playwright Expert

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

Documentation

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.

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:

| Topic | Reference | Load When |

|-------|-----------|-----------|

| Selectors | references/selectors-locators.md | Writing selectors, locator priority |

| Page Objects | references/page-object-model.md | POM patterns, fixtures |

| API Mocking | references/api-mocking.md | Route interception, mocking |

| Configuration | references/configuration.md | playwright.config.ts setup |

| Debugging | references/debugging-flaky.md | Flaky 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');
  }
View full documentation

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](https://jeffallan.github.io/claude-skills/skills/quality/playwright-expert/)

Score breakdown

Trigger
8.0
Explicit trigger-term list and clear scenarios; lacks exclusion boundary.
Structure
10.0
171-line SKILL.md, five compact references, clean Load-When table.
Workflow
8.0
Debug workflow is a closed loop (run, trace, fix, verify 10x); MUST/MUST-NOT constraints cover flakiness.
Content
9.0
Concise imperative style; all TypeScript and npx commands runnable.
Engineering
10.0
Valid frontmatter; all reference paths exist.
Security
10.0
Only dummy test credentials; no egress, secrets, or injection.
Well-built Playwright E2E skill with correct-vs-brittle selector contrast, full POM example, and a flaky-test debug loop ending in a repeat-each-10 stability check; no When-Not in description.