Generate E2E Test
This Skill converts workflow descriptions into working automated end-to-end tests by first performing the workflow step-by-step using Playwright MCP browser tools, then generating and refining test code based on the actual interaction.
Overview
Convert the following workflow description into working automated tests:
$ARGUMENTS
Process
1. Initial Setup
- Start Playwright MCP browser session using
browser_navigateto target URL - Ask the user to authenticate and perform any initialization steps if needed (there are likely already helper methods in the project test platform files for this)
- Take initial snapshot using
browser_snapshotto understand page structure and confirm readiness to begin with the user
2. Manual Workflow Execution
For each step in the described workflow:
Capture state: Use browser_snapshot before each interaction to understand the current page structure
Perform action: Execute using appropriate MCP tools:
browser_click- Click buttons, links, or elementsbrowser_type- Type text into fieldsbrowser_fill_form- Fill multiple form fields at oncebrowser_select_option- Select from dropdownsbrowser_press_key- Press keyboard keys- Other browser tools as needed
Collect selectors:
- Primary: Note
refvalues from accessibility snapshots (most stable) - Fallback: Use
browser_evaluatewith queries likedocument.querySelector('[data-testid="..."]')if needed
Verify outcomes: Use browser_wait_for or snapshot to confirm expected results after each action
Document: Track successful selector patterns and interaction sequences for test generation
3. Generate Test Code
Read project conventions: Review TESTING.md for:
- Test runner setup and syntax
- Available helper methods and fixtures
- Assertion patterns
- File naming and location conventions
Write test spec: Transform recorded workflow into test code using:
- Collected selectors (prefer stable attributes: data-testid, aria-label, role+name)
- Project's testing patterns from TESTING.md
- Appropriate waits and assertions
- Helper methods from
tests/e2e/utils/test-helpers.ts
File location: Place test in appropriate directory under tests/e2e/ based on feature area:
tests/e2e/admin/- Super admin featurestests/e2e/auth/- Authentication flowstests/e2e/client/- Client-specific featurestests/e2e/dashboard/- Dashboard pagestests/e2e/marketing/- Public pagestests/e2e/workouts/- Workout features
4. Validate & Refine
Run test: Execute using project's test command from TESTING.md:
pnpm test:e2e:ai tests/e2e/your-test.spec.ts
Debug failures:
- If selector issues: Return to MCP browser, use
browser_snapshotandbrowser_evaluateto find better selectors - If timing issues: Add appropriate waits using
waitForElementWithRetryor similar helpers - If assertion failures: Verify expected values using MCP tools
Iterate: Repeat debugging until test passes consistently
Key MCP Tools Usage
Discovery:
browser_snapshot(primary) - Get page structure and element informationbrowser_evaluate(for complex queries) - Execute JavaScript to query DOM
Actions:
browser_click- Click elementsbrowser_type- Type textbrowser_fill_form- Fill multiple form fieldsbrowser_select_option- Select dropdown optionsbrowser_press_key- Press keyboard keys
Validation:
browser_wait_for- Wait for elements or conditionsbrowser_verify_*tools - Verify element visibility, text, and values
Debugging:
browser_console_messages- Check console errorsbrowser_network_requests- Inspect network activitybrowser_take_screenshot- Capture visual state
Best Practices
Selector Strategy
- Prefer accessibility-based selectors (role, aria-label) over fragile CSS
- Use test utilities like
getByRole(),getByText(),getByLabel()from Playwright - Always verify selectors return only a single element to avoid strict mode violations
- Check if actions are in dropdown menus (look for "More actions" buttons)
Waiting and Timing
- Always wait for elements/text after navigation or async operations
- Use helper methods like
waitForElementWithRetry()for robust waiting - For table data: Use
waitForTableLoaded(page)before interacting with table elements
Test Structure
- Use fixtures from
tests/e2e/fixtures.tsfor pre-configured test data - Test both happy path and error conditions when specified
- Scope selectors to specific containers to avoid matching toast notifications
- Clean up test data using protected email patterns (
e2e-*@example.com)
Navigation
- Use
navigateToPage()helper instead ofpage.goto()for reliable client-side routing - Wait for content-based conditions, not just
domcontentloaded
Examples
Simple Form Test
import { test, expect } from './fixtures'
import { navigateToPage, expectToast } from './utils/test-helpers'
test('user can create exercise', async ({ page, superAdminUser }) => {
await navigateToPage(page, '/super-admin/exercises')
await page.getByRole('button', { name: 'Add Exercise' }).click()
await page.getByLabel('Name').fill('Bench Press')
await page.getByLabel('Muscle Group').selectOption('Chest')
await page.getByRole('button', { name: 'Save' }).click()
await expectToast(page, 'Exercise created successfully')
})
Workflow with Dropdown Menu
test('user can delete exercise', async ({ page, superAdminUser }) => {
await navigateToPage(page, '/super-admin/exercises')
// Open dropdown menu first
const row = page.locator('tr').filter({ hasText: 'Bench Press' })
await row.locator('[aria-label*="More actions"]').click()
// Then select delete action
await page.getByRole('menuitem', { name: 'Delete' }).click()
await page.getByRole('button', { name: 'Confirm' }).click()
await expectToast(page, 'Exercise deleted successfully')
})
Requirements
- Playwright MCP server must be running and connected
- Development server should be running at http://localhost:3000
- Project must have
TESTING.mdand test utilities configured
Troubleshooting
If tests fail:
- Read the AI Coding Agent Reporter output in
test-report-for-coding-agents/all-failures.md - Check console logs using
browser_console_messages - Inspect DOM structure with
browser_snapshot - Verify network requests with
browser_network_requests - Take screenshots at failure points with
browser_take_screenshot
If stuck debugging, ask a human to inspect the Playwright trace in playwright-report/ which contains detailed execution information.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.