MCPInstall

playwright-e2e-testing

Author and maintain versioned Playwright (@playwright/test) TypeScript UI specs for browser user flows. Use when asked to create, run, debug, or refactor E2E tests, form/navigation/auth flows, responsive checks, UI mocking, fixtures, Page Objects, or visual comparisons. Use api-testing for standalone REST/GraphQL contracts and playwright-cli for live browser sessions. Keywords: E2E spec, Playwright test, POM, fixtures, UI regression.

Installs
616
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/fugazi/test-automation-skills-agents --skill playwright-e2e-testing
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads playwright-e2e-testing automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Playwright E2E Testing (TypeScript)

Comprehensive toolkit for end-to-end testing of web applications using Playwright with TypeScript. Enables robust UI testing, UI-dependent API setup, and responsive design verification following best practices.

Activation: This skill is triggered when authoring or maintaining versioned Playwright UI specs and their test infrastructure.

When to Use This Skill

  • Write E2E tests for user flows, forms, navigation, and authentication
  • UI-dependent API setup via the request fixture or network interception
  • Responsive testing across mobile, tablet, and desktop viewports
  • Debug flaky tests using traces, screenshots, videos, and Playwright Inspector
  • Setup test infrastructure with Page Object Model and fixtures
  • Mock/intercept APIs for isolated, deterministic testing
  • Visual regression testing with screenshot comparisons

Do NOT Use For

  • Standalone API/contract testing with no browser (use api-testing).
  • Driving a live browser interactively for exploration or debugging (use playwright-cli).
  • Governing a large regression suite, tiers, or CI sharding strategy (use playwright-regression-testing).
  • Selenium/Java browser automation (use webapp-selenium-testing).

Prerequisites

RequirementDetails
Node.jsv18+ recommended
Package Managernpm, yarn, or pnpm
Playwright@playwright/test package
TypeScripttypescript + ts-node (optional but recommended)
BrowsersInstalled via npx playwright install

Quick Setup

# Initialize new project
npm init playwright@latest

# Or add to existing project
npm install -D @playwright/test
npx playwright install

First Questions to Ask

Before writing tests, clarify:

  1. App URL: Local dev server command + port, or staging URL?
  2. Critical flows: Which user journeys must be covered (happy path + error states)?
  3. Browsers/devices: Chrome, Firefox, Safari? Mobile viewports?
  4. API strategy: Real backend, mocked responses, or hybrid?
  5. Test data: Seed data available? Reset/cleanup strategy?

Core Principles

1. Test Runner & TypeScript

Always use @playwright/test with TypeScript for type safety and better IDE support.

import { test, expect } from "@playwright/test";

test("user can login", async ({ page }) => {
  await page.goto("/login");
  await page.getByLabel("Email").fill("user@test.com");
  await page.getByLabel("Password").fill("password123");
  await page.getByRole("button", { name: "Sign in" }).click();
  await expect(page).toHaveURL(/.*dashboard/);
});

2. Locator Strategy (Priority Order)

Prefer role-based locators (getByRole) with accessible names, then label → placeholder → text → test ID → CSS (last resort). XPath is never used.

➡️ Full priority hierarchy, role reference, and examples: Locator Strategies: Priority — the single source of truth.

3. Auto-Waiting & Web-First Assertions

Playwright auto-waits for elements. Never use sleep() or arbitrary timeouts.

// [ok] Web-first assertions (auto-retry)
await expect(page.getByRole("alert")).toBeVisible();
await expect(page).toHaveURL(/dashboard/);
await expect(page.getByTestId("status")).toHaveText("Success!");

// [no] Avoid manual waits
await page.waitForTimeout(2000); // Bad practice

4. Test Structure with Steps

Use test.step() for readable reports and failure localization:

test("checkout flow", async ({ page }) => {
  await test.step("Add item to cart", async () => {
    await page.goto("/products/1");
    await page.getByRole("button", { name: "Add to Cart" }).click();
  });

  await test.step("Complete checkout", async () => {
    await page.goto("/checkout");
    await page.getByRole("button", { name: "Pay Now" }).click();
  });

  await test.step("Verify confirmation", async () => {
    await expect(page.getByRole("heading")).toContainText("Order Confirmed");
  });
});

Key Workflows

Forms & Navigation

// Form submit and wait for navigation (auto-waiting)
await page.getByRole("button", { name: "Login" }).click();
await expect(page).toHaveURL(/.*dashboard/);

// Form with API response validation
const responsePromise = page.waitForResponse(
  (r) => r.url().includes("/api/login") && r.status() === 200,
);
await page.getByRole("button", { name: "Login" }).click();
const response = await responsePromise;

API Testing (Request Fixture)

test("API health check", async ({ request }) => {
  const response = await request.get("/api/health");
  expect(response.ok()).toBeTruthy();
  expect(await response.json()).toMatchObject({ status: "ok" });
});

API Mocking & Interception

test("handles API error", async ({ page }) => {
  await page.route("**/api/users", (route) =>
    route.fulfill({
      status: 500,
      body: JSON.stringify({ error: "Server error" }),
    }),
  );
  await page.goto("/users");
  await expect(page.getByRole("alert")).toContainText("Something went wrong");
});

Responsive Testing

const viewports = [
  { width: 375, height: 667, name: "mobile" },
  { width: 768, height: 1024, name: "tablet" },
  { width: 1280, height: 720, name: "desktop" },
];

for (const vp of viewports) {
  test(`navigation works on ${vp.name}`, async ({ page }) => {
    await page.setViewportSize(vp);
    await page.goto("/");
    // Mobile: hamburger menu
    if (vp.width < 768) {
      await page.getByRole("button", { name: /menu/i }).click();
    }
    await page.getByRole("link", { name: "About" }).click();
    await expect(page).toHaveURL(/about/);
  });
}

Configuration

Use playwright.config.ts for project-wide settings:

import { defineConfig, devices } from "@playwright/test";

export default defineConfig({
  testDir: "./tests",
  retries: process.env.CI ? 2 : 0,
  reporter: [["html"], ["junit", { outputFile: "results.xml" }]],
  use: {
    baseURL: "http://localhost:3000",
    trace: "on-first-retry",
    screenshot: "only-on-failure",
    video: "retain-on-failure",
  },
  projects: [
    { name: "chromium", use: devices["Desktop Chrome"] },
    { name: "mobile", use: devices["Pixel 5"] },
  ],
  webServer: {
    command: "npm run dev",
    url: "http://localhost:3000",
    reuseExistingServer: !process.env.CI,
  },
});

Troubleshooting

ProblemCauseSolution
Element not foundWrong locator or not renderedUse PWDEBUG=1 to inspect, verify with getByRole
Timeout waitingElement hidden or slow loadCheck for overlays, increase timeout, use waitFor()
Flaky testsRace conditions, animationsAdd test.step(), use proper waits, disable animations
Strict mode violationMultiple elements matchUse .first(), .filter(), or more specific locator
Screenshots differDynamic contentMask dynamic areas, use deterministic data
CI fails, local passesEnvironment differencesCheck baseURL, timeouts, webServer config
API mock not workingRoute pattern mismatchUse **/api/... glob, verify with page.on('request')

CLI Quick Reference

CommandDescription
npx playwright testRun all tests headless
npx playwright test --uiOpen UI mode (interactive)
npx playwright test --headedRun with visible browser
npx playwright test --debugRun with Playwright Inspector
npx playwright test -g "login"Run tests matching pattern
npx playwright test --project=chromiumRun specific project
npx playwright show-reportOpen HTML report
npx playwright codegenGenerate tests by recording
PWDEBUG=1 npx playwright testDebug with Inspector
DEBUG=pw:api npx playwright testVerbose API logging

Red Flags

  • CSS/XPath locators when a role/label/testId is available — brittle and breaks on refactor.
  • waitForTimeout / manual sleeps instead of web-first auto-retrying assertions.
  • Tests sharing state and depending on execution order — flaky and order-coupled.
  • Assertions only on status/URL with no visible-state check — hides render regressions.
  • Inline page setup repeated across tests instead of fixtures — duplication and drift.

References

DocumentContent
Snippets: SetupConfig, auth setup, custom fixtures & logging
Snippets: InteractionsForm interactions, API testing & network interception
Snippets: Viewports & AuthResponsive viewports & authentication patterns
Snippets: Assertions & DebugAssertions, debug commands & utility helpers
Locator Strategies: PriorityLocator priority hierarchy & role-based locators
Locator Strategies: TextLabel, text, placeholder, alt-text & test-ID locators
Locator Strategies: FilteringFiltering, chaining & complex locator patterns
Locator Strategies: Anti & DebugAnti-patterns, CSS last-resort, debugging & quick reference
POM: BasicsPOM concepts, directory structure, base page & fluent API
POM: ComponentsPage object & reusable component object implementation
POM: FixturesCustom & authenticated page-object fixtures
POM: PracticesBest practices, anti-patterns & a complete worked example
Debugging: Tools & UIDebugging tools, UI mode, Inspector & headed mode
Debugging: Tracing & LogsTrace viewer, verbose logging, screenshots & videos
Debugging: Errors & NetworkConsole/page errors & network debugging
Debugging: Flaky & LocatorsFlaky-test fixes, locator debugging & quick commands

Verification

  • Uses custom fixture injection — No new PageObject() calls in spec files; all POMs injected via fixtures
  • Locators use recommended strategies — All locators use getByRole(), getByTestId(), or getByText(); no CSS selectors for interactive elements
  • Tests are independent — Each test sets up and tears down its own state; no beforeAll with shared mutable state
  • Error states covered — At least one test verifies error/empty/loading states alongside happy path

FAQ

What does the playwright-e2e-testing skill do?

Author and maintain versioned Playwright (@playwright/test) TypeScript UI specs for browser user flows. Use when asked to create, run, debug, or refactor E2E tests, form/navigation/auth flows, responsive checks, UI mocking, fixtures, Page Objects, or visual comparisons. Use api-testing for standalone REST/GraphQL contracts and playwright-cli for live browser sessions. Keywords: E2E spec, Playwright test, POM, fixtures, UI regression.

How do I install playwright-e2e-testing?

Run npx skills add https://github.com/fugazi/test-automation-skills-agents --skill playwright-e2e-testing in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/playwright-e2e-testing/ (personal) or .claude/skills/playwright-e2e-testing/ (project).

Which AI agents can use playwright-e2e-testing?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is playwright-e2e-testing safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains playwright-e2e-testing?

It is published by fugazi in fugazi/test-automation-skills-agents. It has 616 recorded installs.

More from fugazi/test-automation-skills-agents

View all →

qa-manual-istqb

fugazi/test-automation-skills-agents

Open the skill to read its SKILL.md instructions.

Testing & QA200 installs

a11y-playwright-testing

fugazi/test-automation-skills-agents

Open the skill to read its SKILL.md instructions.

Testing & QA139 installs

qa-test-planner

fugazi/test-automation-skills-agents

Open the skill to read its SKILL.md instructions.

Testing & QA106 installs

api-testing

fugazi/test-automation-skills-agents

Open the skill to read its SKILL.md instructions.

Testing & QA101 installs

webapp-playwright-testing

fugazi/test-automation-skills-agents

Open the skill to read its SKILL.md instructions.

Testing & QA82 installs

playwright-regression-testing

fugazi/test-automation-skills-agents

Open the skill to read its SKILL.md instructions.

Testing & QA82 installs

Popular testing & qa skills

View category →

tdd

mattpocock/skills

Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.

Testing & QA1.2M installs

grilling

mattpocock/skills

Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.

Testing & QA996.2K installs

migrate-to-shoehorn

mattpocock/skills

Migrate test files from as type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace as in tests, or needs partial test data.

Testing & QA484.1K installs

run-train

lllllllama/rigorpilot-skills

Rigor Train skill for deep learning research repositories. Use when a documented or selected training command should be run conservatively for startup verification, short-run verification, full kickoff, or resume, with command, config, seed, log, checkpoint, status, and metric evidence written to standardized trainoutputs/. Do not use for environment setup, exploratory sweeps, speculative idea implementation, or end-to-end orchestration.

Testing & QA337.8K installs

test-driven-development

obra/superpowers

Use when implementing any feature or bugfix, before writing implementation code

Testing & QA261.8K installs

Use when implementation is complete, all tests pass, and you need to decide how to integrate the work

Testing & QA216.8K installs