Claude-skill-registry e2e-flow-test
Execute complete user flow testing with Playwright MCP, testing end-to-end journeys through the application
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/e2e-flow-test" ~/.claude/skills/majiayu000-claude-skill-registry-e2e-flow-test && rm -rf "$T"
manifest:
skills/data/e2e-flow-test/SKILL.mdsource content
E2E Flow Testing Skill
Overview
This skill executes complete user flow testing using Playwright MCP. It tests end-to-end journeys through the application, from start to finish, verifying that multi-step processes work correctly.
Standard Test Plan Location
Plan file:
tests/e2e-test-plan.md
This skill reads flow definitions from the test plan at
tests/e2e-test-plan.md. If the plan file doesn't exist, the calling command should invoke the e2e-test-plan skill first to generate it.
Purpose
Ensure that:
- Complete user journeys work from start to finish
- State persists correctly between steps
- Error handling works throughout flows
- Edge cases in flows are handled
- Business logic executes correctly
Workflow
Step 0: Test Plan Verification (REQUIRED FIRST)
CRITICAL: Before testing flows, verify the test plan exists.
-
Check for Test Plan
- Look for
tests/e2e-test-plan.md - If the file exists, read the "Critical Flows" section
- If the file does NOT exist, STOP and report that the plan must be generated first
- Look for
-
Read Flow Definitions from Plan
- Extract authentication flows
- Extract core business flows
- Extract administrative flows
- Use this list for testing
Step 1: Identify Critical Flows
-
Authentication Flows
- User registration
- User login
- Password reset
- Logout
-
Core Business Flows
- Main feature workflows
- CRUD operations
- Transactions/checkouts
- Data processing
-
Administrative Flows
- User management
- Configuration changes
- Reporting
Step 2: Flow Documentation
For each flow, document:
## Flow: User Registration ### Overview Complete user registration from signup to verified account ### Steps 1. Navigate to registration page 2. Fill registration form 3. Submit form 4. Receive confirmation 5. Verify email (if applicable) 6. Complete profile (if applicable) 7. Access dashboard ### Prerequisites - No existing account - Valid email address ### Expected Outcomes - User account created - Verification email sent - User can login - Profile accessible ### Error Cases - Duplicate email - Weak password - Invalid email format - Required fields missing
Step 3: Execute Flow Tests
For EACH flow:
-
Setup
- Clear any previous state
- Prepare test data
- Set initial conditions
-
Execute Steps
- Perform each step
- Verify state after each step
- Capture snapshots
-
Verify Outcome
- Check final state
- Verify data persistence
- Check side effects
-
Test Error Cases
- Repeat flow with error conditions
- Verify proper error handling
Common Flow Patterns
Registration Flow
Step 1: Navigate to Registration browser_navigate({ url: "/register" }) browser_snapshot() Verify: Registration form visible Step 2: Fill Registration Form browser_fill_form({ fields: [ { name: "Name", type: "textbox", ref: "[name-ref]", value: "Test User" }, { name: "Email", type: "textbox", ref: "[email-ref]", value: "test@example.com" }, { name: "Password", type: "textbox", ref: "[password-ref]", value: "SecurePass123!" }, { name: "Confirm Password", type: "textbox", ref: "[confirm-ref]", value: "SecurePass123!" } ] }) browser_snapshot() Verify: All fields filled Step 3: Submit Form browser_click({ element: "Register button", ref: "[submit-ref]" }) browser_wait_for({ text: "Account created" OR redirect to dashboard }) browser_snapshot() browser_console_messages({ level: "error" }) Verify: No errors, success message or redirect Step 4: Verify Account If email verification required: Check for verification message Else: browser_snapshot() Verify: Dashboard or profile accessible Step 5: Verify Can Login browser_navigate({ url: "/logout" }) browser_navigate({ url: "/login" }) browser_fill_form with credentials browser_click submit browser_wait_for dashboard Verify: Successfully logged in
Login Flow
Step 1: Navigate to Login browser_navigate({ url: "/login" }) browser_snapshot() Verify: Login form visible Step 2: Enter Credentials browser_fill_form({ fields: [ { name: "Email", type: "textbox", ref: "[email-ref]", value: "user@example.com" }, { name: "Password", type: "textbox", ref: "[password-ref]", value: "password" } ] }) Step 3: Submit browser_click({ element: "Login button", ref: "[submit-ref]" }) browser_wait_for({ text: "Dashboard" OR text: "Welcome" }) browser_snapshot() Verify: Logged in state, user menu visible Step 4: Verify Session browser_navigate({ url: "/profile" }) browser_snapshot() Verify: User profile accessible browser_navigate({ url: "/protected-page" }) browser_snapshot() Verify: Protected content accessible
Password Reset Flow
Step 1: Navigate to Forgot Password browser_navigate({ url: "/forgot-password" }) browser_snapshot() Verify: Email input form visible Step 2: Request Reset browser_type({ element: "Email field", ref: "[email-ref]", text: "user@example.com" }) browser_click({ element: "Send reset link", ref: "[submit-ref]" }) browser_wait_for({ text: "email sent" OR text: "check your email" }) browser_snapshot() Verify: Success message Step 3: (Simulated) Click Reset Link browser_navigate({ url: "/reset-password?token=TEST_TOKEN" }) browser_snapshot() Verify: Password reset form visible Step 4: Set New Password browser_fill_form({ fields: [ { name: "New Password", type: "textbox", ref: "[password-ref]", value: "NewPass123!" }, { name: "Confirm Password", type: "textbox", ref: "[confirm-ref]", value: "NewPass123!" } ] }) browser_click({ element: "Reset Password", ref: "[submit-ref]" }) browser_wait_for({ text: "Password updated" OR redirect to login }) browser_snapshot() Verify: Success message or login page
CRUD Flow (Create-Read-Update-Delete)
Step 1: Navigate to List browser_navigate({ url: "/items" }) browser_snapshot() Note: Initial item count Step 2: Create Item browser_click({ element: "Create new", ref: "[create-ref]" }) browser_snapshot() Verify: Create form visible browser_fill_form({ fields: [ { name: "Title", type: "textbox", ref: "[title-ref]", value: "Test Item" }, { name: "Description", type: "textbox", ref: "[desc-ref]", value: "Test description" } ] }) browser_click({ element: "Save", ref: "[save-ref]" }) browser_wait_for({ text: "created" OR redirect to list }) browser_snapshot() Verify: Item created, appears in list Step 3: Read Item browser_click({ element: "View item", ref: "[view-ref]" }) browser_snapshot() Verify: Item details displayed correctly Step 4: Update Item browser_click({ element: "Edit", ref: "[edit-ref]" }) browser_snapshot() Verify: Edit form with current values browser_type({ element: "Title field", ref: "[title-ref]", text: "Updated Title" }) browser_click({ element: "Save", ref: "[save-ref]" }) browser_wait_for({ text: "updated" }) browser_snapshot() Verify: Changes saved Step 5: Delete Item browser_click({ element: "Delete", ref: "[delete-ref]" }) If confirmation dialog: browser_handle_dialog({ accept: true }) browser_wait_for({ textGone: "Updated Title" }) browser_snapshot() Verify: Item removed from list
Checkout Flow (E-commerce)
Step 1: Add to Cart browser_navigate({ url: "/products/1" }) browser_click({ element: "Add to cart", ref: "[add-ref]" }) browser_wait_for({ text: "Added" OR cart count update }) browser_snapshot() Verify: Item in cart Step 2: View Cart browser_navigate({ url: "/cart" }) browser_snapshot() Verify: Cart shows item, correct price Step 3: Proceed to Checkout browser_click({ element: "Checkout", ref: "[checkout-ref]" }) browser_snapshot() Verify: Checkout form visible Step 4: Fill Shipping browser_fill_form({ fields: [ { name: "Address", type: "textbox", ref: "[address-ref]", value: "123 Test St" }, { name: "City", type: "textbox", ref: "[city-ref]", value: "Test City" }, { name: "Zip", type: "textbox", ref: "[zip-ref]", value: "12345" } ] }) browser_click({ element: "Continue", ref: "[continue-ref]" }) browser_snapshot() Step 5: Payment browser_fill_form({ fields: [ { name: "Card Number", type: "textbox", ref: "[card-ref]", value: "4242424242424242" }, { name: "Expiry", type: "textbox", ref: "[expiry-ref]", value: "12/25" }, { name: "CVV", type: "textbox", ref: "[cvv-ref]", value: "123" } ] }) browser_click({ element: "Pay Now", ref: "[pay-ref]" }) browser_wait_for({ text: "Order confirmed" }) browser_snapshot() Verify: Order confirmation page Step 6: Verify Order browser_navigate({ url: "/orders" }) browser_snapshot() Verify: Order appears in order history
Error Case Testing
Invalid Input Errors
Step 1: Navigate to form Step 2: Fill with invalid data Step 3: Submit Step 4: Verify: Error messages displayed Step 5: Verify: Form not submitted Step 6: Verify: User can correct and retry
Network Error Simulation
Step 1: Start flow normally Step 2: Introduce network issue (if possible) Step 3: Attempt action Step 4: Verify: Error handled gracefully Step 5: Verify: User informed of issue Step 6: Verify: Can retry action
Session Timeout
Step 1: Login Step 2: Navigate to protected page Step 3: Clear session (if possible) Step 4: Attempt action Step 5: Verify: Redirect to login Step 6: Verify: Action can be completed after re-login
Output Format
Flow Test Results
# Flow Test Results ## Summary - Total Flows: 8 - Passed: 7 - Failed: 1 - Skipped: 0 ## Detailed Results ### Flow: User Registration - Status: PASSED - Duration: 12.5s | Step | Action | Status | Notes | |------|--------|--------|-------| | 1 | Navigate to /register | OK | Form visible | | 2 | Fill registration form | OK | All fields filled | | 3 | Submit form | OK | No errors | | 4 | Verify account | OK | Dashboard accessible | | 5 | Verify can login | OK | Login successful | ### Flow: User Login - Status: PASSED - Duration: 5.2s | Step | Action | Status | Notes | |------|--------|--------|-------| | 1 | Navigate to /login | OK | Form visible | | 2 | Enter credentials | OK | Fields filled | | 3 | Submit | OK | Redirect to dashboard | | 4 | Verify session | OK | Protected pages accessible | ### Flow: Checkout - Status: FAILED - Duration: 18.7s | Step | Action | Status | Notes | |------|--------|--------|-------| | 1 | Add to cart | OK | Item added | | 2 | View cart | OK | Cart displayed | | 3 | Proceed to checkout | OK | Form visible | | 4 | Fill shipping | OK | Address saved | | 5 | Payment | FAILED | Payment gateway timeout | | 6 | Verify order | SKIPPED | Previous step failed | Error Details: - Location: Payment step - Error: NetworkError - Payment gateway timeout after 30s - Console: "Error: Payment processing failed" ## Error Cases Tested ### Registration - Duplicate Email - Status: PASSED - Verified: Error message shown - Verified: Form not submitted ### Login - Invalid Password - Status: PASSED - Verified: Error message shown - Verified: Still on login page ### Checkout - Empty Cart - Status: PASSED - Verified: Cannot proceed to checkout - Verified: Message shown ## Recommendations 1. **Payment Timeout**: Increase gateway timeout or add retry logic 2. **Add Loading States**: Some actions lack visual feedback 3. **Error Recovery**: Consider saving cart state for failed checkouts
Best Practices
- Test Happy Path First - Ensure normal flow works
- Test Every Step - Don't skip intermediate states
- Verify State - Check data persists between steps
- Test Error Cases - Include failure scenarios
- Document Dependencies - Note flow prerequisites
- Check Side Effects - Emails, notifications, etc.
- Clean Up - Reset state between flow tests
- Capture Evidence - Take snapshots at each step