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 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
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
- Navigate to registration page
- Fill registration form
- Submit form
- Receive confirmation
- Verify email (if applicable)
- Complete profile (if applicable)
- 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
- Payment Timeout: Increase gateway timeout or add retry logic
- Add Loading States: Some actions lack visual feedback
- 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