All skills
jeffallan avatar

/playwright-expert

@efebc44
by jeffallanjeffallan/claude-skills12k stars
1,124

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.

Use this Skill: https://skilld.dev/gh/jeffallan/claude-skills/playwright-expert

This session only. Nothing lands on disk.

referencesselectors-locators.md

≈700 tokens on demand. Your agent reads this file only when SKILL.md points to it.

Selectors & Locators

Selector Priority (Best to Worst)

// 1. Role-based (BEST - accessible)
await page.getByRole('button', { name: 'Submit' });
await page.getByRole('textbox', { name: 'Email' });
await page.getByRole('link', { name: 'Home' });
await page.getByRole('heading', { level: 1 });

// 2. Label/placeholder (good for forms)
await page.getByLabel('Email address');
await page.getByPlaceholder('Enter your email');

// 3. Test ID (good for non-semantic elements)
await page.getByTestId('user-avatar');
await page.getByTestId('submit-button');

// 4. Text content
await page.getByText('Welcome back');
await page.getByText(/welcome/i);  // Case insensitive

// 5. CSS/XPath (AVOID - brittle)
await page.locator('.submit-btn');  // Last resort
await page.locator('#email-input');

Role-Based Selectors

// Buttons
page.getByRole('button', { name: 'Submit' });
page.getByRole('button', { name: /save/i });

// Links
page.getByRole('link', { name: 'Documentation' });

// Inputs
page.getByRole('textbox', { name: 'Username' });
page.getByRole('checkbox', { name: 'Remember me' });
page.getByRole('combobox', { name: 'Country' });

// Navigation
page.getByRole('navigation');
page.getByRole('main');
page.getByRole('banner');

// Tables
page.getByRole('row', { name: 'John Doe' });
page.getByRole('cell', { name: 'Active' });

Filtering Locators

// Filter by text
page.getByRole('listitem').filter({ hasText: 'Product A' });

// Filter by child locator
page.getByRole('listitem').filter({
  has: page.getByRole('button', { name: 'Delete' })
});

// Filter by NOT having
page.getByRole('listitem').filter({
  hasNot: page.getByText('Sold out')
});

// Chain locators
page.getByTestId('product-card').getByRole('button', { name: 'Buy' });

Handling Multiple Elements

// Get nth element (0-indexed)
page.getByRole('listitem').nth(0);
page.getByRole('listitem').first();
page.getByRole('listitem').last();

// Count elements
const count = await page.getByRole('listitem').count();

// Iterate
for (const item of await page.getByRole('listitem').all()) {
  console.log(await item.textContent());
}

Test IDs

<!-- Add in HTML -->
<button data-testid="submit-button">Submit</button>
// Configure custom attribute
// playwright.config.ts
use: {
  testIdAttribute: 'data-test-id'
}

// Use in tests
page.getByTestId('submit-button');

Quick Reference

Locator Best For
getByRole() Buttons, links, inputs
getByLabel() Form fields
getByPlaceholder() Inputs without labels
getByTestId() Non-semantic elements
getByText() Static text
filter() Narrowing results
nth() / first() Multiple matches

Source: SKILL.md on GitHub

1 alert16d5 checks · Risk CRITICAL
  • Gen Agent Trust Hub16d

    Error: AI Analysis failed - API error after retries

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW · No issues

  • Runlayer6mo

    6 files scanned · No issues

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at efebc44. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 months ago.

Steadyupdated 5 months ago
Other metadata
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"
}
  • Testing
  • TypeScript
  • playwright
  • e2e-testing
  • browser-automation
  • page-object-model
  • ui-testing
  • visual-testing
  • ci-cd

README badge

README badge for jeffallan/claude-skills/playwright-expert

Writes Playwright E2E tests using the Page Object Model pattern, handles test fixtures and configuration, debugs flaky tests via trace viewer, and integrates into CI/CD pipelines. Targets browser automation workflows with role-based selectors, auto-waiting, and parallel test execution.

Generated from the current SKILL.md.

Does this skill help with visual regression testing?
Yes. The skill covers visual regression testing and includes reference guides for setting up visual comparisons as part of your test suite.
What selector strategy does this skill recommend?
Role-based selectors (getByRole, getByLabel) are preferred for resilience to styling changes. CSS class selectors are discouraged as brittle.
Does this skill cover CI/CD integration?
Yes. The skill includes guidance on adding Playwright tests to CI/CD pipelines and configuring parallel execution.
How does this skill approach flaky tests?
It provides a debugging workflow using trace viewer and screenshots, emphasizes auto-waiting over arbitrary timeouts, and recommends running tests multiple times to verify stability.
Does this skill use Page Object Model?
Yes. POM is a core pattern recommended for maintainability, with included reference guide and code examples.

Generated from the current SKILL.md. These answers refresh after source changes.