DevOps & Tooling · Claude Code
Playwright End-to-End Testing Claude Skill (SKILL.md)
A Claude Code skill (SKILL.md) for Playwright End-to-End Testing: the stack's conventions, steps and checks, loaded when a task needs them.
- Path
- .claude/skills/playwright-e2e/SKILL.md
- Loads
- Description match or /skill-name
- Format
- Folder skill (SKILL.md)
- Used by
- Claude Code
What this file tells the agent
Claude Code reads each skill's name and description at startup and loads the rest of SKILL.md when a task matches. This Playwright End-to-End Testing skill gives it the stack's conventions, the steps to follow and the checks to run, only when they are needed.
- Strictly ban hardcoded delays (page.waitForTimeout()); rely exclusively on Playwright web-first auto-waiting assertions (expect(locator).toBeVisible()).
- Prioritize user-facing accessible locators: page.getByRole(), page.getByLabel(), and page.getByTestId(); never write fragile CSS selectors or brittle XPaths.
- Encapsulate multi-step interactions inside modular Page Object Models (POM) with typed parameters.
- Ensure total test isolation: authenticate via storage state (storageState) instead of repeating manual UI logins in every test.
- Configure trace viewer and video capture on first retry (trace: 'on-first-retry') for painless CI debugging.
Code to avoid, and what to write instead
The rule steers the agent away from the left and toward the right.
// Flaky: Brittle selectors, arbitrary sleep timeouts, and no auto-waiting
test("bad test", async ({ page }) => {
await page.goto("/catalog");
await page.click("div.col-md-4 > button:nth-child(2)"); // Breaks on minor CSS tweak!
await page.waitForTimeout(5000); // Flaky anti-pattern!
const text = await page.innerText("#cart-total");
expect(text).toBe("1");
});import { test, expect } from "@playwright/test";
test.describe("Checkout Flow", () => {
test("allows user to complete cart purchase", async ({ page }) => {
await page.goto("/catalog");
// Accessible, user-facing locators
await page.getByRole("button", { name: "Add to Cart" }).first().click();
await page.getByRole("link", { name: "Cart (1)" }).click();
// Auto-waiting assertions
await expect(page.getByRole("heading", { name: "Your Shopping Cart" })).toBeVisible();
await page.getByRole("button", { name: "Proceed to Checkout" }).click();
await expect(page).toHaveURL(/.*checkout/);
});
});Install it in one command
- 01
Go to your project root
The file goes at .claude/skills/playwright-e2e/SKILL.md, relative to the root.
- 02
Download the file
Run the command on the right. It downloads this preset and writes the file.
- 03
Make sure it gets used
Claude Code lists the skill at startup and loads it when a request matches its description. You can also run it with /<skill-name>.
$ mkdir -p ".claude/skills/playwright-e2e" && curl -fsSL "https://www.devscratchpad.tech/api/raw/claude-skills/playwright-e2e" -o ".claude/skills/playwright-e2e/SKILL.md"
writes .claude/skills/playwright-e2e/SKILL.md
.claude/skills/playwright-e2e/SKILL.md
To write the file from your own code instead, use Read your code or Convert Legacy Rules in the editor above.
More for Playwright End-to-End Testing
Questions
- How does Claude Code discover this Playwright End-to-End Testing skill?
- Claude Code reads the name and description in the frontmatter of .claude/skills/playwright-e2e/SKILL.md at startup, and loads the full skill when a request matches that description.
- Can I invoke this skill manually?
- Yes. Type / followed by the skill's name in Claude Code, or ask for the task in plain words, for example "review this change against our Playwright End-to-End Testing conventions".