Skip to main content
skill Claude Code

generate — Claude skill: Playwright tests from a prompt

The generate skill writes Playwright tests from a user story, URL, component name or feature description. Useful when an e2e scenario needs covering and you would rather not hand-write it.

Install into Claude Code · Plugin marketplace All methods and platforms ↓
/plugin marketplace add alirezarezvani/claude-skills
/plugin install pw@claude-code-skills
Open on GitHub

What generate does

You pass the skill an argument describing what to test: a story like "user can log in with email and password", a component path such as src/components/UserProfile.tsx, a page name or a feature. It parses that input, reads playwright.config.ts, checks existing tests in testDir, looks for page objects in pages/ and fixtures in fixtures/, and inspects auth setup via auth.setup.ts or storageState.

Templates cover login, CRUD, checkout, search with filters, forms, dashboards, settings, onboarding, API and accessibility. Each one gets adapted to your app — placeholders swapped for real selectors, URLs and data. Generation follows fixed rules: locators in the order getByRole(), getByLabel(), getByText(), getByPlaceholder(), getByTestId(); web-first assertions only, so they auto-retry; no page.waitForTimeout() and no bare CSS selectors. TypeScript projects get .spec.ts, JavaScript projects get .spec.js with require().

After writing the file, the skill runs npx playwright test --reporter=list and fixes the test if it fails. Playwright and a working config need to be in place first, otherwise the codebase exploration steps have nothing to read. Worth installing if you already run an e2e suite that keeps growing. If Playwright is not part of your stack, skip it.

What it helps with

  • turn a user story into an e2e test
  • generate a test for a single React component
  • cover a form with validation and error states
  • add tests for a search page with filters
  • match a new test to the project's fixtures and conventions

Example prompts for the agent

  • write tests for the login page with email and password
  • generate an e2e test for the checkout flow
  • add tests for src/components/UserProfile.tsx

How to install generate

1Plugin marketplace

/plugin marketplace add alirezarezvani/claude-skills
/plugin install pw@claude-code-skills

This installs the whole pw plugin with all its skills

2Skills CLI (Vercel)

npx skills add alirezarezvani/claude-skills --skill generate -a claude-code

3Manually: put the files in place

~/.claude/skills/generate/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/generate/

From the same set349

The whole set →
engineering-skills Alireza Rezvani An engineering skill index for Claude Code that helps you select one specialist SKILL.md for the task at hand. It covers architecture, testing, DevOps, and data work. Claude Code 2,387installs finance-skills Alireza Rezvani Routes ambiguous finance prompts to the right bundled skill: financial-analyst, saas-metrics-coach, or month-end-close. Claude Code 2,312installs marketing-skills Alireza Rezvani A directory and router for marketing skills in Claude Code. It picks the right specialist skill for SEO, content, CRO, channels, and related tasks. Claude Code 2,264installs business-growth-skills Alireza Rezvani Routes growth and revenue prompts to the right specialized skill across customer success, sales engineering, RevOps, and proposals in Claude Code. Claude Code 2,189installs engineering-advanced-skills Alireza Rezvani An index of 37 engineering skills for architecture, automation, reliability, and platform work. Use it when a project needs task-specific engineering workflows. Claude Code 2,019installs product-skills Alireza Rezvani Product work orchestrator for Claude Code. Routes queries across 16 domain lanes and validates discovery trees with deterministic scripts. Claude Code 1,994installs pm-skills Alireza Rezvani Routes project-delivery requests across 8 PM sub-skills for Jira, Confluence, sprints, reporting, and team communication. Useful for controlled delivery work. Claude Code 1,975installs senior-backend Alireza Rezvani Scaffolds backend APIs, detects database bottlenecks, and runs load tests. Useful when designing Express routes, optimizing PostgreSQL, or preparing for production. Claude Code 1,674installs

Similar

Questions about generate

How do I install generate in Claude?

Add the marketplace with /plugin marketplace add alirezarezvani/claude-skills, then install the plugin: /plugin install pw@claude-code-skills. You can also run npx skills add alirezarezvani/claude-skills --skill generate -a claude-code.

What does the generate skill do?

It produces Playwright tests from a user story, URL, component name or feature description. Before writing, it reads your config and existing tests so the output fits the project.

What do I need before using it?

Playwright installed and a playwright.config.ts with testDir and baseURL. The skill also runs the generated test through npx playwright test, so your environment has to allow that.

Source text

SKILL.md · MIT
---
name: "generate"
description: >-
  Generate Playwright tests. Use when user says "write tests", "generate tests",
  "add tests for", "test this component", "e2e test", "create test for",
  "test this page", or "test this feature".
---

# Generate Playwright Tests

Generate production-ready Playwright tests from a user story, URL, component name, or feature description.

## Input

`$ARGUMENTS` contains what to test. Examples:
- `"user can log in with email and password"`
- `"the checkout flow"`
- `"src/components/UserProfile.tsx"`
- `"the search page with filters"`

## Steps

### 1. Understand the Target

Parse `$ARGUMENTS` to determine:
- **User story**: Extract the behavior to verify
- **Component path**: Read the component source code
- **Page/URL**: Identify the route and its elements
- **Feature name**: Map to relevant app areas

### 2. Explore the Codebase

Use the `Explore` subagent to gather context:

- Read `playwright.config.ts` for `testDir`, `baseURL`, `projects`
- Check existing tests in `testDir` for patterns, fixtures, and conventions
- If a component path is given, read the component to understand its props, states, and interactions
- Check for existing page objects in `pages/`
- Check for existing fixtures in `fixtures/`
- Check for auth setup (`auth.setup.ts` or `storageState` config)

### 3. Select Templates

Check `templates/` in this plugin for matching patterns:

| If testing... | Load template from |
|---|---|
| Login/auth flow | `../pw/templates/auth/login.md` |
| CRUD operations | `templates/crud/` |
| Checkout/payment | `templates/checkout/` |
| Search/filter UI | `templates/search/` |
| Form submission | `templates/forms/` |
| Dashboard/data | `templates/dashboard/` |
| Settings page | `templates/settings/` |
| Onboarding flow | `templates/onboarding/` |
| API endpoints | `templates/api/` |
| Accessibility | `templates/accessibility/` |

Adapt the template to the specific app — replace `{{placeholders}}` with actual selectors, URLs, and data.

### 4. Generate the Test

Follow these rules:

**Structure:**
```typescript
import { test, expect } from '@playwright/test';
// Import custom fixtures if the project uses them

test.describe('Feature Name', () => {
  // Group related behaviors

  test('should <expected behavior>', async ({ page }) => {
    // Arrange: navigate, set up state
    // Act: perform user action
    // Assert: verify outcome
  });
});
```

**Locator priority** (use the first that works):
1. `getByRole()` — buttons, links, headings, form elements
2. `getByLabel()` — form fields with labels
3. `getByText()` — non-interactive text content
4. `getByPlaceholder()` — inputs with placeholder text
5. `getByTestId()` — when semantic options aren't available

**Assertions** — always web-first:
```typescript
// GOOD — auto-retries
await expect(page.getByRole('heading')).toBeVisible();
await expect(page.getByRole('alert')).toHaveText('Success');

// BAD — no retry
const text = await page.textContent('.msg');
expect(text).toBe('Success');
```

**Never use:**
- `page.waitForTimeout()`
- `page.$(selector)` or `page.$$(selector)`
- Bare CSS selectors unless absolutely necessary
- `page.evaluate()` for things locators can do

**Always include:**
- Descriptive test names that explain the behavior
- Error/edge case tests alongside happy path
- Proper `await` on every Playwright call
- `baseURL`-relative navigation (`page.goto('/')` not `page.goto('http://...')`)

### 5. Match Project Conventions

- If project uses TypeScript → generate `.spec.ts`
- If project uses JavaScript → generate `.spec.js` with `require()` imports
- If project has page objects → use them instead of inline locators
- If project has custom fixtures → import and use them
- If project has a test data directory → create test data files there

### 6. Generate Supporting Files (If Needed)

- **Page object**: If the test touches 5+ unique locators on one page, create a page object
- **Fixture**: If the test needs shared setup (auth, data), create or extend a fixture
- **Test data**: If the test uses structured data, create a JSON file in `test-data/`

### 7. Verify

Run the generated test:

```bash
npx playwright test <generated-file> --reporter=list
```

If it fails:
1. Read the error
2. Fix the test (not the app)
3. Run again
4. If it's an app issue, report it to the user

## Output

- Generated test file(s) with path
- Any supporting files created (page objects, fixtures, data)
- Test run result
- Coverage note: what behaviors are now tested

© Alireza Rezvani · MIT · alirezarezvani/claude-skills

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor