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.
/plugin marketplace add alirezarezvani/claude-skills
/plugin install pw@claude-code-skillsWhat 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-skillsThis installs the whole pw plugin with all its skills
2Skills CLI (Vercel)
npx skills add alirezarezvani/claude-skills --skill generate -a claude-code3Manually: put the files in place
~/.claude/skills/generate/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/generate/
Manually: put the files in place
.agents/skills/generate/SKILL.mdFor all projects use ~/.agents/skills/
Manually: put the files in place
.cursor/skills/generate/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install alirezarezvani/claude-skills generate2Manually: put the files in place
.github/skills/generate/SKILL.mdPlatform CLI
gemini skills install https://github.com/alirezarezvani/claude-skills --path engineering-team/playwright-pro/skills/generateManually: put the files in place
.devin/skills/generate/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set349
The whole set →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