
Playwright Visual Testing
- 1k installs
- 61 repo stars
- Updated June 13, 2026
- manutej/luxor-claude-marketplace
playwright-visual-testing is a testing skill that runs automated visual regression, accessibility, keyboard navigation, and component state validation on a React component library or design system using the Playwright MC
About
playwright-visual-testing is a manutej/luxor-claude-marketplace skill demonstrating a complete Playwright MCP workflow for design system QA. It tests React component libraries—covering Button variants such as Primary, Secondary, Danger, and Ghost plus Input types for Text, Email, Password, and Error states—across rendering, visual consistency, accessibility, keyboard navigation, responsive behavior, and documentation accuracy. Developers reach for playwright-visual-testing before shipping Storybook-hosted component libraries when visual drift, a11y regressions, or interactive state bugs would affect downstream product teams. The example targets storybook.example.com-style hosts and produces evidence across all component states and breakpoints.
- Complete workflow for testing a React component library using the Playwright MCP server
- Validates component rendering in all states and variants
- Performs visual regression testing, accessibility verification, and responsive behavior checks
- Tests interactive element functionality and keyboard navigation
- Generates documentation from verified component states
Playwright Visual Testing by the numbers
- 1,049 all-time installs (skills.sh)
- +30 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #522 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Security screen: HIGH risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/manutej/luxor-claude-marketplace --skill playwright-visual-testingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1k |
|---|---|
| repo stars | ★ 61 |
| Security audit | 2 / 3 scanners passed |
| Last updated | June 13, 2026 |
| Repository | manutej/luxor-claude-marketplace ↗ |
How do you test a design system visually?
Run automated visual regression, accessibility, and state validation tests on a component library or design system.
Who is it for?
Frontend developers maintaining a Storybook-hosted React component library who need automated visual, accessibility, and interaction regression coverage.
Skip if: Backend API integration tests, unit tests without a browser, or projects without a component library or Storybook surface to test.
When should I use this skill?
A React component library or design system needs Playwright visual regression, a11y verification, or multi-state component validation before release.
What you get
Visual regression screenshots, accessibility audit results, component state validation reports, and responsive behavior test evidence.
- visual regression screenshots
- accessibility audit report
- component state validation results
By the numbers
- Example covers 4 Button variants: Primary, Secondary, Danger, and Ghost
Files
Playwright Visual Testing & Browser Automation
A comprehensive skill for browser automation and visual testing using Playwright MCP server integration. This skill enables rapid UI testing, visual regression detection, automated browser interactions, and cross-browser validation for modern web applications.
When to Use This Skill
Use this skill when:
- Testing web applications across multiple browsers (Chromium, Firefox, WebKit)
- Implementing visual regression testing for UI changes
- Automating user interactions for QA and testing
- Validating responsive designs across different viewports
- Taking screenshots for documentation or bug reports
- Testing form submissions and user workflows
- Verifying accessibility of web interfaces
- Debugging browser-specific issues
- Creating automated E2E test suites
- Validating web applications before deployment
- Testing PWAs and single-page applications
- Capturing visual states for design reviews
Core Concepts
Playwright Browser Automation Philosophy
Playwright provides reliable end-to-end testing for modern web apps:
- Auto-wait: Automatically waits for elements to be actionable before interacting
- Web-first assertions: Retry assertions until they pass or timeout
- Cross-browser: Test on Chromium, Firefox, and WebKit with single API
- Accessibility snapshots: Navigate pages using semantic structure, not visual rendering
- Visual testing: Compare screenshots to detect visual regressions
- Network control: Intercept and mock network requests
- Multi-context: Test multiple scenarios in isolated browser contexts
Key Playwright Entities
1. Browser: The browser instance (Chromium, Firefox, WebKit) 2. Page: A single page/tab in the browser 3. Locator: Element selector using accessibility tree 4. Snapshot: Accessibility tree representation of page state 5. Screenshot: Visual capture of page or element 6. Network Request: HTTP requests made by the page 7. Console Messages: Browser console output 8. Dialog: Browser prompts, alerts, confirms
Visual Testing Workflow
1. Navigate to the target page 2. Wait for page to stabilize (animations, loading) 3. Capture accessibility snapshot for context 4. Take screenshot of page or specific elements 5. Compare against baseline (optional) 6. Validate visual appearance and functionality 7. Document results and issues
Playwright MCP Server Tools Reference
Browser Lifecycle Management
browser_navigate
Navigate to a URL in the current page.
Parameters:
url: The URL to navigate to (required)Example:
url: "https://example.com"Best Practices:
- Use full URLs including protocol (https://)
- Wait for navigation to complete before taking actions
- Handle redirects and page transitions
browser_navigate_back
Navigate back to the previous page in history.
Parameters: None
Example:
// Navigate back after clicking a linkUse Cases:
- Testing navigation flows
- Verifying back button behavior
- Multi-step form navigation
browser_close
Close the current browser page.
Parameters: None
When to Use:
- Clean up after testing
- Free system resources
- Reset browser state
browser_resize
Resize the browser viewport.
Parameters:
width: Width in pixels (required)
height: Height in pixels (required)Common Viewports:
// Mobile
width: 375, height: 667 // iPhone SE
width: 414, height: 896 // iPhone XR
// Tablet
width: 768, height: 1024 // iPad
// Desktop
width: 1280, height: 720 // HD
width: 1920, height: 1080 // Full HDExample:
width: 375
height: 667Page Inspection & Snapshots
browser_snapshot
Capture accessibility snapshot of the current page.
Parameters: None
Returns:
- Accessibility tree with semantic structure
- Element references (ref) for interactions
- Text content and roles
- Interactive elements and states
Why Use Snapshots:
- Better than screenshots for automation
- Semantic understanding of page structure
- Element references for precise interactions
- Faster than visual parsing
- Works without visual rendering
Example Snapshot Structure:
heading "Welcome" [ref=123]
text "to our site"
button "Sign In" [ref=456]
textbox "Email" [ref=789]
value: ""browser_take_screenshot
Take a screenshot of the current page or element.
Parameters:
filename: Output filename (optional, defaults to page-{timestamp}.png)
type: Image format - "png" or "jpeg" (default: png)
fullPage: Capture full scrollable page (default: false)
element: Human-readable element description (optional)
ref: Element reference from snapshot (optional, requires element)Screenshot Types:
1. Viewport Screenshot (default):
filename: "homepage-viewport.png"2. Full Page Screenshot:
filename: "homepage-full.png"
fullPage: true3. Element Screenshot:
filename: "header.png"
element: "main header navigation"
ref: "123"Best Practices:
- Use descriptive filenames with context
- PNG for UI elements (lossless)
- JPEG for photos/images (smaller size)
- Full page for documentation
- Element screenshots for focused testing
Browser Interaction
browser_click
Perform click on an element.
Parameters:
element: Human-readable element description (required)
ref: Element reference from snapshot (required)
button: "left", "right", or "middle" (default: left)
doubleClick: true for double-click (default: false)
modifiers: Array of modifier keys ["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]Examples:
1. Basic Click:
element: "Submit button"
ref: "456"2. Right Click:
element: "Context menu trigger"
ref: "789"
button: "right"3. Click with Modifier:
element: "Link to open in new tab"
ref: "123"
modifiers: ["ControlOrMeta"]4. Double Click:
element: "Word to select"
ref: "321"
doubleClick: truebrowser_type
Type text into an editable element.
Parameters:
element: Human-readable element description (required)
ref: Element reference from snapshot (required)
text: Text to type (required)
slowly: Type one character at a time (default: false)
submit: Press Enter after typing (default: false)Examples:
1. Form Input:
element: "Email textbox"
ref: "123"
text: "user@example.com"2. Search with Submit:
element: "Search field"
ref: "456"
text: "playwright testing"
submit: true3. Character-by-Character (triggers key handlers):
element: "Auto-complete input"
ref: "789"
text: "New York"
slowly: truebrowser_press_key
Press a keyboard key.
Parameters:
key: Key name or character (required)Common Keys:
ArrowLeft, ArrowRight, ArrowUp, ArrowDown
Enter, Escape, Tab, Backspace, Delete
Home, End, PageUp, PageDown
F1-F12
Control, Alt, Shift, MetaExamples:
// Navigation
key: "ArrowDown"
// Submit form
key: "Enter"
// Close dialog
key: "Escape"
// Tab through fields
key: "Tab"browser_fill_form
Fill multiple form fields at once.
Parameters:
fields: Array of field objects (required)
- name: Human-readable field name
- type: "textbox", "checkbox", "radio", "combobox", "slider"
- ref: Element reference from snapshot
- value: Value to set (string, "true"/"false" for checkboxes)Example:
fields: [
{
name: "Username",
type: "textbox",
ref: "123",
value: "john_doe"
},
{
name: "Password",
type: "textbox",
ref: "456",
value: "secretpass123"
},
{
name: "Remember me",
type: "checkbox",
ref: "789",
value: "true"
}
]browser_select_option
Select option from dropdown.
Parameters:
element: Human-readable element description (required)
ref: Element reference from snapshot (required)
values: Array of values to select (required)Example:
element: "Country dropdown"
ref: "123"
values: ["United States"]Multi-select:
element: "Programming languages"
ref: "456"
values: ["JavaScript", "Python", "Go"]browser_hover
Hover over an element.
Parameters:
element: Human-readable element description (required)
ref: Element reference from snapshot (required)Use Cases:
- Trigger tooltips
- Show dropdown menus
- Test hover states
- Reveal hidden elements
Example:
element: "Help icon"
ref: "123"browser_drag
Drag and drop between elements.
Parameters:
startElement: Source element description (required)
startRef: Source element reference (required)
endElement: Target element description (required)
endRef: Target element reference (required)Example:
startElement: "Task card"
startRef: "123"
endElement: "Done column"
endRef: "456"Use Cases:
- Drag-and-drop interfaces
- Reordering lists
- File uploads
- Kanban boards
Advanced Interactions
browser_evaluate
Execute JavaScript in page context.
Parameters:
function: JavaScript function as string (required)
element: Element description (optional)
ref: Element reference (optional, requires element)Examples:
1. Page-level Script:
function: "() => { return document.title; }"2. Element-level Script:
element: "Custom widget"
ref: "123"
function: "(element) => { return element.getAttribute('data-value'); }"Common Use Cases:
// Get page title
function: "() => document.title"
// Scroll to bottom
function: "() => window.scrollTo(0, document.body.scrollHeight)"
// Get element dimensions
function: "(element) => { const rect = element.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }"
// Set local storage
function: "() => localStorage.setItem('theme', 'dark')"
// Get computed style
function: "(element) => getComputedStyle(element).backgroundColor"browser_file_upload
Upload files to file input.
Parameters:
paths: Array of absolute file paths (required)
- Omit or pass empty array to cancel file chooserExample:
paths: [
"/Users/user/Documents/resume.pdf",
"/Users/user/Photos/headshot.jpg"
]Single File:
paths: ["/Users/user/Downloads/report.csv"]Cancel Upload:
paths: []Browser State & Debugging
browser_console_messages
Get console messages from the browser.
Parameters:
onlyErrors: Return only error messages (default: false)Returns:
- All console.log, console.error, console.warn messages
- Timestamps and message types
- JavaScript errors and stack traces
Examples:
1. All Messages:
onlyErrors: false2. Errors Only:
onlyErrors: trueUse Cases:
- Debug JavaScript errors
- Monitor API failures
- Track console warnings
- Verify logging behavior
browser_network_requests
Get all network requests since page load.
Parameters: None
Returns:
- URL, method, status code
- Request/response headers
- Timing information
- Request/response bodies
Use Cases:
- Verify API calls
- Check resource loading
- Debug failed requests
- Monitor performance
- Validate analytics tracking
browser_handle_dialog
Respond to browser dialogs.
Parameters:
accept: Accept or dismiss dialog (required)
promptText: Text for prompt dialogs (optional)Dialog Types:
- alert: Information message
- confirm: Yes/No choice
- prompt: Text input request
- beforeunload: Page navigation warning
Examples:
1. Accept Alert:
accept: true2. Dismiss Confirm:
accept: false3. Answer Prompt:
accept: true
promptText: "John Doe"browser_wait_for
Wait for conditions before proceeding.
Parameters:
text: Wait for text to appear (optional)
textGone: Wait for text to disappear (optional)
time: Wait for specified seconds (optional)Examples:
1. Wait for Text:
text: "Loading complete"2. Wait for Removal:
textGone: "Loading..."3. Fixed Wait:
time: 2Best Practices:
- Prefer waiting for specific conditions over fixed time
- Use for dynamic content loading
- Wait for animations to complete
- Ensure page stability before screenshots
Tab Management
browser_tabs
Manage browser tabs.
Parameters:
action: "list", "new", "close", "select" (required)
index: Tab index for close/select (optional)Actions:
1. List Tabs:
action: "list"2. New Tab:
action: "new"3. Close Tab:
action: "close"
index: 1 // Optional, closes current if omitted4. Switch Tab:
action: "select"
index: 0Use Cases:
- Multi-tab workflows
- Testing tab-specific features
- Opening links in new tabs
- Managing multiple sessions
Browser Installation
browser_install
Install the browser specified in config.
Parameters: None
When to Use:
- First-time setup
- "Browser not installed" errors
- Updating browser version
- CI/CD environment setup
Visual Testing Workflow Patterns
Pattern 1: Basic Visual Regression Test
Scenario: Verify homepage hasn't changed visually
1. Navigate to page
- Use browser_navigate with target URL
- Wait for page to load completely
2. Capture baseline
- Take full-page screenshot
- Use browser_snapshot for context
- Document visible elements
3. Make changes (if testing changes)
- Update code, deploy
- Clear cache
4. Capture new state
- Navigate to same URL
- Take identical screenshot
- Compare manually or with tools
5. Validate differences
- Expected changes present
- No unexpected regressions
- Document findingsPattern 2: Responsive Design Testing
Scenario: Test layout across devices
1. Define viewports
- Mobile: 375x667 (iPhone SE)
- Tablet: 768x1024 (iPad)
- Desktop: 1920x1080 (Full HD)
2. For each viewport:
a. Resize browser
- browser_resize with dimensions
b. Navigate to page
- browser_navigate to URL
c. Wait for layout
- browser_wait_for with condition
d. Capture snapshot
- browser_snapshot for structure
e. Take screenshot
- browser_take_screenshot with descriptive name
- Include viewport in filename
3. Compare layouts
- Verify responsive breakpoints
- Check element reflow
- Validate mobile navigation
- Ensure content accessibility
4. Document issues
- Screenshot any problems
- Note viewport where issue occurs
- Record expected vs actual behaviorPattern 3: Form Testing Workflow
Scenario: Test multi-step form submission
1. Navigate to form
- browser_navigate to form URL
- browser_snapshot to get field refs
2. Fill form fields
- Use browser_fill_form for batch entry
- Or individual browser_type for each field
- Include validation triggers
3. Test validation
- Submit with invalid data
- browser_snapshot to see errors
- Screenshot error states
- Verify error messages appear
4. Complete valid submission
- Fill all required fields
- browser_click submit button
- Wait for success message
- browser_wait_for confirmation text
5. Verify results
- Check success page
- Verify data submission
- Screenshot confirmation
- Check network requestsPattern 4: Element-Specific Visual Testing
Scenario: Test individual component changes
1. Navigate to component page
- browser_navigate to page
- browser_snapshot for structure
2. Locate component
- Find element ref from snapshot
- Verify component is visible
3. Test states
a. Default state
- Take element screenshot
- Document initial appearance
b. Hover state
- browser_hover on element
- Take element screenshot
- Compare with default
c. Active/focused state
- browser_click on element
- Take element screenshot
- Verify visual feedback
d. Error state (if applicable)
- Trigger validation error
- Take element screenshot
- Verify error styling
4. Document state changes
- Compare screenshots
- Note expected behaviors
- Report any issuesPattern 5: Cross-Browser Testing
Scenario: Verify consistency across browsers
1. Define browser matrix
- Chromium (Chrome/Edge)
- Firefox
- WebKit (Safari)
2. For each browser:
a. Configure browser
- Set in MCP server config
b. Run test suite
- Navigate to pages
- Capture snapshots
- Take screenshots
- Test interactions
c. Document results
- Save browser-specific screenshots
- Note rendering differences
- Log browser-specific bugs
3. Compare results
- Side-by-side screenshots
- Functionality differences
- Performance variations
- CSS rendering issues
4. Address discrepancies
- Fix critical cross-browser bugs
- Document acceptable differences
- Add browser-specific styles if neededPattern 6: E2E User Journey Testing
Scenario: Complete user workflow validation
1. Start journey
- browser_navigate to landing page
- browser_snapshot initial state
- Screenshot starting point
2. Authentication
- Navigate to login
- Fill credentials with browser_fill_form
- Submit form
- Wait for redirect
- Screenshot logged-in state
3. Main workflow steps
For each step:
- Take snapshot before action
- Perform user action
- Wait for completion
- Take screenshot after action
- Verify expected state
4. Complete transaction
- Submit final action
- Wait for confirmation
- Screenshot success state
- Verify completion message
5. Cleanup
- Logout if needed
- Screenshot final state
- Document journey resultsPattern 7: Accessibility Snapshot Testing
Scenario: Verify semantic structure and accessibility
1. Navigate to page
- browser_navigate to URL
2. Capture accessibility snapshot
- browser_snapshot for semantic tree
- Review element roles
- Check heading hierarchy
- Verify labels and descriptions
3. Validate structure
- Proper heading levels (h1 → h2 → h3)
- Form inputs have labels
- Buttons have accessible names
- Interactive elements have roles
- ARIA attributes present
4. Test keyboard navigation
- browser_press_key "Tab"
- Snapshot after each tab
- Verify focus indicators
- Ensure logical tab order
- Test skip links
5. Test screen reader experience
- Review snapshot text content
- Verify alt text present
- Check ARIA live regions
- Validate semantic landmarks
- Ensure meaningful structure
6. Document findings
- Screenshot accessibility tree
- Note missing labels
- Report hierarchy issues
- Suggest improvementsBrowser Automation Best Practices
Screenshot Best Practices
1. Consistent Naming Convention
{page}-{viewport}-{state}-{timestamp}.png
Examples:
homepage-desktop-default-1634567890.png
login-mobile-error-1634567891.png
checkout-tablet-success-1634567892.png2. Filename Organization
screenshots/
├── baselines/
│ ├── homepage-desktop.png
│ ├── homepage-mobile.png
│ └── homepage-tablet.png
├── current/
│ └── homepage-desktop-20251017.png
└── diffs/
└── homepage-desktop-diff-20251017.png3. Full Page vs Viewport
- Use full page for documentation
- Use viewport for regression testing
- Element screenshots for components
- Consider page length for full-page captures
4. Image Format Selection
- PNG: UI elements, text, sharp edges (lossless)
- JPEG: Photos, backgrounds, large images (smaller size)
- Use PNG by default for testing
Snapshot vs Screenshot Strategy
Use Snapshots When:
- Automating interactions
- Testing functionality
- Verifying structure
- Checking accessibility
- Need element references
- Testing dynamic content
Use Screenshots When:
- Visual regression testing
- Documentation
- Bug reports
- Design reviews
- Stakeholder presentations
- Visual comparisons
Use Both When:
- Comprehensive testing
- Debugging visual issues
- Creating test reports
- Documenting complex flows
Waiting Strategies
1. Wait for Specific Elements
// Good
browser_wait_for with text: "Data loaded"
// Avoid
browser_wait_for with time: 52. Wait for Animations
// Wait for loading spinner to disappear
browser_wait_for with textGone: "Loading..."3. Wait for Network Idle
// Check network requests after waiting
browser_network_requests to verify completion4. Dynamic Content
// Wait for specific text before screenshot
browser_wait_for with text: "Results: 42 items"Interaction Reliability
1. Always Use Snapshots First
1. browser_snapshot
2. Find element ref in snapshot
3. Use ref for interaction
4. Never guess element references2. Verify Element State
// Take snapshot to verify element exists
// Check element is visible and actionable
// Then perform interaction3. Handle Dynamic Elements
// Wait for element to appear
browser_wait_for with text: "Submit"
// Then take fresh snapshot
browser_snapshot
// Get updated ref and interact4. Error Recovery
// If interaction fails:
1. Take screenshot of current state
2. Capture console messages (browser_console_messages)
3. Check network requests (browser_network_requests)
4. Take new snapshot to see current stateForm Testing Strategy
1. Batch vs Individual Entry
// Batch for simple forms (faster)
browser_fill_form with all fields
// Individual for complex forms (better control)
browser_type for each field
browser_wait_for after each entry
Verify validation triggers2. Validation Testing
// Test each validation rule
1. Enter invalid data
2. Attempt submission
3. Snapshot to see errors
4. Screenshot error messages
5. Correct data
6. Verify error clears3. Multi-Step Forms
// Document each step
1. Fill step 1
2. Screenshot before submit
3. Click next
4. Wait for step 2
5. Snapshot new state
6. Repeat for each stepNetwork Monitoring
1. Track API Calls
// After user action
browser_network_requests
// Verify expected endpoints called
// Check status codes
// Validate request/response data2. Performance Testing
// Capture network timing
browser_network_requests
// Analyze:
- Request count
- Total transfer size
- Response times
- Failed requests3. Debug Failed Requests
browser_network_requests
// Find failed requests
// Check error messages
// Screenshot current state
// Console messages for errorsDevelopment Acceleration Strategies
Strategy 1: Test Template Creation
Create reusable test patterns:
Visual Regression Test Template:
1. Navigate: browser_navigate to {URL}
2. Wait: browser_wait_for for {condition}
3. Baseline: browser_take_screenshot "baseline-{name}.png", fullPage: true
4. [Make changes]
5. Capture: browser_take_screenshot "current-{name}.png", fullPage: true
6. Compare: [Manual or automated comparison]
7. Document: Screenshot any differences
Responsive Test Template:
For viewport in [mobile, tablet, desktop]:
1. Resize: browser_resize to {viewport dimensions}
2. Navigate: browser_navigate to {URL}
3. Wait: browser_wait_for for stability
4. Snapshot: browser_snapshot
5. Screenshot: browser_take_screenshot "{page}-{viewport}.png"
6. Validate: Check layout integrity
Form Test Template:
1. Navigate: browser_navigate to {form URL}
2. Snapshot: browser_snapshot for refs
3. Fill: browser_fill_form with test data
4. Screenshot: "form-filled.png"
5. Submit: browser_click submit button
6. Wait: browser_wait_for for result
7. Verify: Snapshot and screenshot result
8. Check: browser_network_requests for submissionStrategy 2: Automated Screenshot Organization
Organize screenshots systematically:
Project Structure:
tests/
visual/
baselines/ # Reference screenshots
results/ # Current test screenshots
diffs/ # Difference images
reports/ # HTML reports with comparisons
Naming Convention:
{test-name}_{viewport}_{state}_{date}.png
Examples:
login_desktop_default_20251017.png
cart_mobile_empty_20251017.png
checkout_tablet_error_20251017.png
Metadata File:
screenshot-metadata.json:
{
"screenshot": "login_desktop_default_20251017.png",
"timestamp": "2025-10-17T10:30:00Z",
"url": "https://example.com/login",
"viewport": {"width": 1920, "height": 1080},
"browser": "chromium",
"test": "login_flow",
"passed": true
}Strategy 3: Parallel Multi-Browser Testing
Test across browsers efficiently:
Browser Matrix:
- Chromium (latest)
- Firefox (latest)
- WebKit (latest)
Parallel Execution:
1. Define test suite
2. Configure each browser
3. Run tests in parallel
4. Collect results
5. Compare across browsers
6. Generate cross-browser report
Result Organization:
screenshots/
chromium/
homepage.png
login.png
firefox/
homepage.png
login.png
webkit/
homepage.png
login.png
comparison/
homepage-browsers.html
login-browsers.htmlStrategy 4: Visual Regression Automation
Automate visual comparison workflow:
1. Capture Baselines (one-time):
- Navigate to each page
- Take reference screenshots
- Store in baselines/
2. Run Visual Tests:
- Navigate to each page
- Take current screenshots
- Store in results/
3. Compare Images:
- Pixel-by-pixel comparison
- Highlight differences
- Generate diff images
- Calculate similarity score
4. Generate Report:
- List all comparisons
- Show side-by-side views
- Highlight failures
- Include metrics
5. Review and Update:
- Review failures
- Accept intentional changes
- Update baselines
- Fix regressionsStrategy 5: Component Library Testing
Test design system components:
Component Test Suite:
For each component:
1. Navigate to component page
2. Snapshot for structure
3. Test each variant:
- Default
- Hover
- Active
- Disabled
- Error
4. Screenshot each state
5. Verify accessibility
6. Check responsive behavior
Documentation Generation:
1. Capture all component states
2. Organize by component
3. Generate visual catalog
4. Include code examples
5. Document usage guidelines
Example:
components/
Button/
button-default.png
button-hover.png
button-active.png
button-disabled.png
button-error.png
Input/
input-default.png
input-focus.png
input-error.png
input-disabled.pngTroubleshooting
Common Issues
Screenshot appears blank
- Wait for page to load: browser_wait_for
- Check if element is visible: browser_snapshot
- Ensure page has rendered: Add delay
- Verify URL is correct
Element not found for interaction
- Take fresh snapshot: browser_snapshot
- Check element ref is current
- Wait for element to appear: browser_wait_for
- Verify element exists in snapshot
Browser not launching
- Run browser_install
- Check MCP server configuration
- Verify browser binary path
- Check system permissions
Screenshot differs from expected
- Check viewport size: browser_resize
- Wait for animations: browser_wait_for
- Ensure font loading complete
- Disable dynamic content (timestamps, ads)
Form submission fails
- Verify all required fields filled
- Check validation errors: browser_snapshot
- Wait for submit button to be enabled
- Check console for JavaScript errors: browser_console_messages
Network requests not captured
- Call browser_network_requests after action
- Ensure page has completed requests
- Check for request failures
- Verify request timing
Dialog not handled
- Set up browser_handle_dialog before triggering
- Accept or dismiss appropriately
- Provide promptText for prompt dialogs
- Test dialog in advance
Debugging Workflow
1. Capture Current State
1. browser_snapshot - See page structure
2. browser_take_screenshot - See visual state
3. browser_console_messages onlyErrors: true - Check errors
4. browser_network_requests - See network activity2. Isolate Issue
1. Simplify test to minimum reproduction
2. Test in single browser
3. Disable dynamic content
4. Remove variable elements
5. Test step-by-step3. Document Problem
1. Screenshot before issue
2. Screenshot at failure point
3. Capture console messages
4. Save network requests
5. Note expected vs actual
6. Include reproduction stepsPractical Examples
Example 1: Homepage Visual Regression
Test homepage hasn't visually changed:
1. Navigate
browser_navigate
url: "https://example.com"
2. Wait for page load
browser_wait_for
textGone: "Loading..."
3. Capture baseline
browser_take_screenshot
filename: "homepage-baseline.png"
fullPage: true
4. [After code changes, repeat]
5. Capture current
browser_take_screenshot
filename: "homepage-current.png"
fullPage: true
6. Compare images manually or with tools
7. Document differencesExample 2: Login Form Testing
Test login form functionality:
1. Navigate to login
browser_navigate
url: "https://example.com/login"
2. Get form structure
browser_snapshot
3. Fill form
browser_fill_form
fields: [
{
name: "Email",
type: "textbox",
ref: "123",
value: "test@example.com"
},
{
name: "Password",
type: "textbox",
ref: "456",
value: "password123"
}
]
4. Screenshot filled form
browser_take_screenshot
filename: "login-filled.png"
5. Submit
browser_click
element: "Sign In button"
ref: "789"
6. Wait for redirect
browser_wait_for
text: "Welcome back"
7. Screenshot success
browser_take_screenshot
filename: "login-success.png"
8. Verify network request
browser_network_requestsExample 3: Responsive Design Check
Test responsive layout:
Mobile:
1. Resize to mobile
browser_resize
width: 375
height: 667
2. Navigate
browser_navigate
url: "https://example.com"
3. Wait
browser_wait_for
time: 2
4. Screenshot
browser_take_screenshot
filename: "homepage-mobile.png"
fullPage: true
Tablet:
5. Resize to tablet
browser_resize
width: 768
height: 1024
6. Navigate
browser_navigate
url: "https://example.com"
7. Screenshot
browser_take_screenshot
filename: "homepage-tablet.png"
fullPage: true
Desktop:
8. Resize to desktop
browser_resize
width: 1920
height: 1080
9. Navigate
browser_navigate
url: "https://example.com"
10. Screenshot
browser_take_screenshot
filename: "homepage-desktop.png"
fullPage: trueExample 4: Component State Testing
Test button states:
1. Navigate to component library
browser_navigate
url: "https://example.com/components/button"
2. Get page structure
browser_snapshot
3. Default state
browser_take_screenshot
filename: "button-default.png"
element: "Primary button"
ref: "123"
4. Hover state
browser_hover
element: "Primary button"
ref: "123"
browser_take_screenshot
filename: "button-hover.png"
element: "Primary button"
ref: "123"
5. Active state
browser_click
element: "Primary button"
ref: "123"
browser_take_screenshot
filename: "button-active.png"
element: "Primary button"
ref: "123"
6. Snapshot for verification
browser_snapshotExample 5: E2E Checkout Flow
Test complete checkout process:
1. Navigate to product
browser_navigate
url: "https://example.com/products/item-123"
2. Add to cart
browser_snapshot
browser_click
element: "Add to Cart button"
ref: "456"
browser_wait_for
text: "Added to cart"
3. Go to cart
browser_click
element: "Cart icon"
ref: "789"
browser_take_screenshot
filename: "cart-with-item.png"
4. Proceed to checkout
browser_click
element: "Checkout button"
ref: "101"
5. Fill shipping info
browser_snapshot
browser_fill_form
fields: [
{name: "Name", type: "textbox", ref: "111", value: "John Doe"},
{name: "Address", type: "textbox", ref: "222", value: "123 Main St"},
{name: "City", type: "textbox", ref: "333", value: "New York"},
{name: "Zip", type: "textbox", ref: "444", value: "10001"}
]
6. Screenshot checkout
browser_take_screenshot
filename: "checkout-filled.png"
fullPage: true
7. Complete order
browser_click
element: "Place Order button"
ref: "555"
browser_wait_for
text: "Order confirmed"
8. Screenshot confirmation
browser_take_screenshot
filename: "order-confirmed.png"
fullPage: true
9. Verify network requests
browser_network_requestsExample 6: Accessibility Testing
Test keyboard navigation and structure:
1. Navigate to page
browser_navigate
url: "https://example.com/form"
2. Capture semantic structure
browser_snapshot
3. Verify heading hierarchy
- Check h1 → h2 → h3 order
- Ensure single h1
- Verify logical structure
4. Test keyboard navigation
browser_press_key
key: "Tab"
browser_snapshot
browser_take_screenshot
filename: "focus-field-1.png"
5. Continue tabbing
browser_press_key
key: "Tab"
browser_snapshot
browser_take_screenshot
filename: "focus-field-2.png"
6. Verify all interactive elements reachable
- Buttons
- Links
- Form fields
- Custom widgets
7. Check ARIA labels
- Form labels present
- Button labels descriptive
- Error messages announced
- Status updates live
8. Screenshot accessibility tree
browser_take_screenshot
filename: "accessibility-structure.png"Example 7: Network Debugging
Debug failed API calls:
1. Navigate to page
browser_navigate
url: "https://example.com/dashboard"
2. Wait for page
browser_wait_for
time: 3
3. Check console errors
browser_console_messages
onlyErrors: true
4. Check network requests
browser_network_requests
5. Find failed requests
- Status: 4xx or 5xx
- Timeout errors
- CORS issues
6. Screenshot error state
browser_take_screenshot
filename: "api-error-state.png"
7. Retry action
browser_click
element: "Refresh button"
ref: "123"
8. Monitor new requests
browser_network_requests
9. Document findings
- Failed endpoint
- Error message
- Request/response data
- ScreenshotExample 8: Dialog Handling
Test confirmation dialogs:
1. Navigate to page
browser_navigate
url: "https://example.com/settings"
2. Trigger delete action
browser_snapshot
browser_click
element: "Delete Account button"
ref: "123"
3. Handle confirmation
browser_handle_dialog
accept: false # Cancel first time
4. Verify still on page
browser_snapshot
5. Try again
browser_click
element: "Delete Account button"
ref: "123"
6. Accept this time
browser_handle_dialog
accept: true
7. Wait for result
browser_wait_for
text: "Account deleted"
8. Screenshot confirmation
browser_take_screenshot
filename: "account-deleted.png"Example 9: Tab Management
Test multi-tab workflow:
1. List current tabs
browser_tabs
action: "list"
2. Open link in new tab
browser_click
element: "Privacy Policy link"
ref: "123"
modifiers: ["ControlOrMeta"]
3. Switch to new tab
browser_tabs
action: "select"
index: 1
4. Screenshot new tab
browser_take_screenshot
filename: "privacy-policy.png"
5. Switch back
browser_tabs
action: "select"
index: 0
6. Close extra tab
browser_tabs
action: "close"
index: 1
7. Verify single tab
browser_tabs
action: "list"Example 10: Animation Testing
Test loading animations:
1. Navigate to page
browser_navigate
url: "https://example.com/data-heavy"
2. Screenshot loading state
browser_take_screenshot
filename: "loading-spinner.png"
3. Wait for loading to complete
browser_wait_for
textGone: "Loading..."
4. Wait for animations
browser_wait_for
time: 1
5. Screenshot final state
browser_take_screenshot
filename: "content-loaded.png"
fullPage: true
6. Verify stability
browser_wait_for
time: 2
browser_take_screenshot
filename: "stable-state.png"
fullPage: true
7. Compare screenshots
- loading-spinner.png
- content-loaded.png
- stable-state.pngQuick Reference
Essential Commands
Navigate:
browser_navigate url: "{URL}"
Snapshot:
browser_snapshot
Screenshot:
browser_take_screenshot filename: "{name}.png"
Full Page Screenshot:
browser_take_screenshot filename: "{name}.png", fullPage: true
Element Screenshot:
browser_take_screenshot filename: "{name}.png", element: "{description}", ref: "{ref}"
Click:
browser_click element: "{description}", ref: "{ref}"
Type:
browser_type element: "{description}", ref: "{ref}", text: "{text}"
Fill Form:
browser_fill_form fields: [{name, type, ref, value}, ...]
Wait:
browser_wait_for text: "{text}"
browser_wait_for textGone: "{text}"
browser_wait_for time: {seconds}
Resize:
browser_resize width: {width}, height: {height}
Console:
browser_console_messages onlyErrors: true
Network:
browser_network_requestsCommon Viewport Sizes
Mobile:
375 x 667 (iPhone SE)
390 x 844 (iPhone 12/13/14)
414 x 896 (iPhone 11 Pro Max)
360 x 640 (Android Small)
412 x 915 (Android Large)
Tablet:
768 x 1024 (iPad Portrait)
1024 x 768 (iPad Landscape)
810 x 1080 (Android Tablet)
Desktop:
1280 x 720 (HD)
1366 x 768 (Laptop)
1920 x 1080 (Full HD)
2560 x 1440 (2K)
3840 x 2160 (4K)Test Organization Template
tests/
├── visual/
│ ├── baselines/
│ ├── results/
│ └── diffs/
├── e2e/
│ ├── auth/
│ ├── checkout/
│ └── navigation/
├── responsive/
│ ├── mobile/
│ ├── tablet/
│ └── desktop/
└── components/
├── buttons/
├── forms/
└── navigation/
reports/
├── visual-regression.html
├── cross-browser.html
└── accessibility.htmlResources
- Playwright Documentation
- Playwright API Reference
- Playwright MCP Server
- Visual Testing Guide
- Best Practices
- Accessibility Testing
---
Skill Version: 1.0.0 Last Updated: October 2025 Skill Category: Browser Automation, Visual Testing, Quality Assurance Compatible With: Playwright MCP Server, Chromium, Firefox, WebKit
Component Library Testing Example
Complete workflow for testing a design system component library using Playwright MCP server. This example covers component state validation, visual regression testing, accessibility verification, and documentation generation.
Scenario
Testing a React component library (storybook.example.com) to verify:
- Component rendering in all states
- Visual consistency across variants
- Accessibility and keyboard navigation
- Responsive behavior of components
- Documentation accuracy
- Interactive element functionality
Component Library Structure
Components to Test:
- Button (Primary, Secondary, Danger, Ghost variants)
- Input (Text, Email, Password, Error states)
- Modal (Default, Large, Alert, Confirmation)
- Card (Default, Elevated, Outlined, Interactive)
- Toast/Notification (Success, Error, Warning, Info)
- Dropdown (Single select, Multi-select, Searchable)
Step 1: Button Component Testing
Navigate to Button Component
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-button"Tool: browser_wait_for
Parameters:
text: "Button"Capture Component Page Structure
Tool: browser_snapshot
Returns:
heading "Button" [ref=101]
text "Primary interactive button component" [ref=102]
group "Canvas" [ref=103]
button "Button" [ref=104]
group "Controls" [ref=105]
combobox "Variant" [ref=106]
combobox "Size" [ref=107]
textbox "Label" [ref=108]
checkbox "Disabled" [ref=109]
checkbox "Loading" [ref=110]
navigation "Stories" [ref=111]
link "Primary" [ref=112]
link "Secondary" [ref=113]
link "Danger" [ref=114]
link "Ghost" [ref=115]
link "Sizes" [ref=116]
link "States" [ref=117]Test Primary Button - Default State
Tool: browser_click
Parameters:
element: "Primary story link"
ref: "112"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_snapshot
Returns:
group "Canvas" [ref=201]
button "Click me" [ref=202]
role: buttonTool: browser_take_screenshot
Parameters:
filename: "button-primary-default.png"
element: "Canvas group"
ref: "201"Test Hover State
Tool: browser_hover
Parameters:
element: "Click me button"
ref: "202"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_take_screenshot
Parameters:
filename: "button-primary-hover.png"
element: "Canvas group"
ref: "201"Test Active/Pressed State
Tool: browser_evaluate
Parameters:
element: "Click me button"
ref: "202"
function: "(element) => { element.focus(); }"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_take_screenshot
Parameters:
filename: "button-primary-focus.png"
element: "Canvas group"
ref: "201"Test Disabled State
Tool: browser_click
Parameters:
element: "Disabled checkbox"
ref: "109"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_snapshot
Returns:
button "Click me" [ref=202]
disabled: trueTool: browser_take_screenshot
Parameters:
filename: "button-primary-disabled.png"
element: "Canvas group"
ref: "201"Test Loading State
Tool: browser_click
Parameters:
element: "Disabled checkbox"
ref: "109"Tool: browser_click
Parameters:
element: "Loading checkbox"
ref: "110"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "button-primary-loading.png"
element: "Canvas group"
ref: "201"Test Secondary Button
Tool: browser_click
Parameters:
element: "Secondary story link"
ref: "113"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "button-secondary-default.png"
element: "Canvas group"
ref: "201"Tool: browser_hover
Parameters:
element: "Button"
ref: "202"Tool: browser_take_screenshot
Parameters:
filename: "button-secondary-hover.png"
element: "Canvas group"
ref: "201"Test Danger Button
Tool: browser_click
Parameters:
element: "Danger story link"
ref: "114"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "button-danger-default.png"
element: "Canvas group"
ref: "201"Tool: browser_hover
Parameters:
element: "Button"
ref: "202"Tool: browser_take_screenshot
Parameters:
filename: "button-danger-hover.png"
element: "Canvas group"
ref: "201"Test Button Sizes
Tool: browser_click
Parameters:
element: "Sizes story link"
ref: "116"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_snapshot
Returns:
group "Canvas" [ref=301]
button "Small" [ref=302]
button "Medium" [ref=303]
button "Large" [ref=304]Tool: browser_take_screenshot
Parameters:
filename: "button-sizes-all.png"
element: "Canvas group"
ref: "301"Step 2: Input Component Testing
Navigate to Input Component
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-input"Tool: browser_wait_for
Parameters:
text: "Input"Test Default Input
Tool: browser_snapshot
Returns:
heading "Input" [ref=401]
group "Canvas" [ref=402]
textbox "Email" [ref=403]
placeholder: "Enter your email"
navigation "Stories" [ref=404]
link "Default" [ref=405]
link "With Label" [ref=406]
link "With Error" [ref=407]
link "Disabled" [ref=408]
link "Password" [ref=409]Tool: browser_take_screenshot
Parameters:
filename: "input-default-empty.png"
element: "Canvas group"
ref: "402"Test Input with Text
Tool: browser_type
Parameters:
element: "Email textbox"
ref: "403"
text: "user@example.com"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_take_screenshot
Parameters:
filename: "input-default-filled.png"
element: "Canvas group"
ref: "402"Test Focus State
Tool: browser_click
Parameters:
element: "Email textbox"
ref: "403"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_take_screenshot
Parameters:
filename: "input-default-focus.png"
element: "Canvas group"
ref: "402"Test Error State
Tool: browser_click
Parameters:
element: "With Error story link"
ref: "407"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_snapshot
Returns:
group "Canvas" [ref=501]
group "Input Field" [ref=502]
label "Email" [ref=503]
textbox "Email" [ref=504]
text "Please enter a valid email address" [ref=505]
role: alertTool: browser_take_screenshot
Parameters:
filename: "input-error-state.png"
element: "Canvas group"
ref: "501"Test Disabled State
Tool: browser_click
Parameters:
element: "Disabled story link"
ref: "408"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_snapshot
Returns:
textbox "Email" [ref=504]
disabled: true
value: "disabled@example.com"Tool: browser_take_screenshot
Parameters:
filename: "input-disabled-state.png"
element: "Canvas group"
ref: "501"Test Password Input
Tool: browser_click
Parameters:
element: "Password story link"
ref: "409"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_snapshot
Returns:
group "Canvas" [ref=601]
label "Password" [ref=602]
textbox "Password" [ref=603]
type: password
button "Toggle visibility" [ref=604]Tool: browser_type
Parameters:
element: "Password textbox"
ref: "603"
text: "SecretPassword123"Tool: browser_take_screenshot
Parameters:
filename: "input-password-hidden.png"
element: "Canvas group"
ref: "601"Tool: browser_click
Parameters:
element: "Toggle visibility button"
ref: "604"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_take_screenshot
Parameters:
filename: "input-password-visible.png"
element: "Canvas group"
ref: "601"Step 3: Modal Component Testing
Navigate to Modal Component
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-modal"Tool: browser_wait_for
Parameters:
text: "Modal"Test Default Modal
Tool: browser_snapshot
Returns:
heading "Modal" [ref=701]
group "Canvas" [ref=702]
button "Open Modal" [ref=703]
navigation "Stories" [ref=704]
link "Default" [ref=705]
link "Large" [ref=706]
link "Alert" [ref=707]
link "Confirmation" [ref=708]Tool: browser_take_screenshot
Parameters:
filename: "modal-trigger-default.png"
element: "Canvas group"
ref: "702"Open Modal
Tool: browser_click
Parameters:
element: "Open Modal button"
ref: "703"Tool: browser_wait_for
Parameters:
text: "Modal Title"Tool: browser_snapshot
Returns:
dialog "Modal" [ref=801]
heading "Modal Title" [ref=802]
button "Close" [ref=803]
text "This is the modal content..." [ref=804]
group "Actions" [ref=805]
button "Cancel" [ref=806]
button "Confirm" [ref=807]Tool: browser_take_screenshot
Parameters:
filename: "modal-default-open.png"
fullPage: trueTest Modal Close Button
Tool: browser_click
Parameters:
element: "Close button"
ref: "803"Tool: browser_wait_for
Parameters:
textGone: "Modal Title"Tool: browser_take_screenshot
Parameters:
filename: "modal-default-closed.png"
element: "Canvas group"
ref: "702"Test Large Modal
Tool: browser_click
Parameters:
element: "Large story link"
ref: "706"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_click
Parameters:
element: "Open Modal button"
ref: "703"Tool: browser_wait_for
Parameters:
text: "Large Modal"Tool: browser_take_screenshot
Parameters:
filename: "modal-large-open.png"
fullPage: trueTest Alert Modal
Tool: browser_click
Parameters:
element: "Close button"
ref: "803"Tool: browser_click
Parameters:
element: "Alert story link"
ref: "707"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_click
Parameters:
element: "Open Modal button"
ref: "703"Tool: browser_wait_for
Parameters:
text: "Alert"Tool: browser_snapshot
Returns:
dialog "Alert Modal" [ref=901]
img "Alert Icon" [ref=902]
heading "Warning" [ref=903]
text "This action cannot be undone" [ref=904]
button "I Understand" [ref=905]Tool: browser_take_screenshot
Parameters:
filename: "modal-alert-open.png"
fullPage: trueTest Keyboard Navigation (Escape to Close)
Tool: browser_press_key
Parameters:
key: "Escape"Tool: browser_wait_for
Parameters:
textGone: "Warning"Tool: browser_take_screenshot
Parameters:
filename: "modal-keyboard-closed.png"
element: "Canvas group"
ref: "702"Step 4: Card Component Testing
Navigate to Card Component
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-card"Tool: browser_wait_for
Parameters:
text: "Card"Test Default Card
Tool: browser_snapshot
Returns:
heading "Card" [ref=1001]
group "Canvas" [ref=1002]
article "Card" [ref=1003]
img "Card Image" [ref=1004]
heading "Card Title" [ref=1005]
text "Card description text..." [ref=1006]
button "Action" [ref=1007]
navigation "Stories" [ref=1008]
link "Default" [ref=1009]
link "Elevated" [ref=1010]
link "Outlined" [ref=1011]
link "Interactive" [ref=1012]Tool: browser_take_screenshot
Parameters:
filename: "card-default.png"
element: "Canvas group"
ref: "1002"Test Elevated Card
Tool: browser_click
Parameters:
element: "Elevated story link"
ref: "1010"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "card-elevated.png"
element: "Canvas group"
ref: "1002"Test Outlined Card
Tool: browser_click
Parameters:
element: "Outlined story link"
ref: "1011"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "card-outlined.png"
element: "Canvas group"
ref: "1002"Test Interactive Card
Tool: browser_click
Parameters:
element: "Interactive story link"
ref: "1012"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "card-interactive-default.png"
element: "Canvas group"
ref: "1002"Tool: browser_hover
Parameters:
element: "Card"
ref: "1003"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_take_screenshot
Parameters:
filename: "card-interactive-hover.png"
element: "Canvas group"
ref: "1002"Step 5: Toast/Notification Component Testing
Navigate to Toast Component
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-toast"Tool: browser_wait_for
Parameters:
text: "Toast"Test Success Toast
Tool: browser_snapshot
Returns:
heading "Toast" [ref=1101]
group "Canvas" [ref=1102]
button "Show Success Toast" [ref=1103]
button "Show Error Toast" [ref=1104]
button "Show Warning Toast" [ref=1105]
button "Show Info Toast" [ref=1106]Tool: browser_click
Parameters:
element: "Show Success Toast button"
ref: "1103"Tool: browser_wait_for
Parameters:
text: "Success"Tool: browser_snapshot
Returns:
alert "Toast Notification" [ref=1201]
img "Success Icon" [ref=1202]
text "Success" [ref=1203]
text "Operation completed successfully" [ref=1204]
button "Close" [ref=1205]Tool: browser_take_screenshot
Parameters:
filename: "toast-success.png"
fullPage: trueTest Error Toast
Tool: browser_click
Parameters:
element: "Close toast button"
ref: "1205"Tool: browser_click
Parameters:
element: "Show Error Toast button"
ref: "1104"Tool: browser_wait_for
Parameters:
text: "Error"Tool: browser_take_screenshot
Parameters:
filename: "toast-error.png"
fullPage: trueTest Warning Toast
Tool: browser_click
Parameters:
element: "Close toast button"
ref: "1205"Tool: browser_click
Parameters:
element: "Show Warning Toast button"
ref: "1105"Tool: browser_wait_for
Parameters:
text: "Warning"Tool: browser_take_screenshot
Parameters:
filename: "toast-warning.png"
fullPage: trueTest Info Toast
Tool: browser_click
Parameters:
element: "Close toast button"
ref: "1205"Tool: browser_click
Parameters:
element: "Show Info Toast button"
ref: "1106"Tool: browser_wait_for
Parameters:
text: "Info"Tool: browser_take_screenshot
Parameters:
filename: "toast-info.png"
fullPage: trueStep 6: Dropdown Component Testing
Navigate to Dropdown Component
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-dropdown"Tool: browser_wait_for
Parameters:
text: "Dropdown"Test Single Select Dropdown
Tool: browser_snapshot
Returns:
heading "Dropdown" [ref=1301]
group "Canvas" [ref=1302]
combobox "Select option" [ref=1303]
navigation "Stories" [ref=1304]
link "Single Select" [ref=1305]
link "Multi Select" [ref=1306]
link "Searchable" [ref=1307]Tool: browser_take_screenshot
Parameters:
filename: "dropdown-single-closed.png"
element: "Canvas group"
ref: "1302"Open Dropdown
Tool: browser_click
Parameters:
element: "Select option dropdown"
ref: "1303"Tool: browser_wait_for
Parameters:
text: "Option 1"Tool: browser_snapshot
Returns:
listbox "Options" [ref=1401]
option "Option 1" [ref=1402]
option "Option 2" [ref=1403]
option "Option 3" [ref=1404]
option "Option 4" [ref=1405]Tool: browser_take_screenshot
Parameters:
filename: "dropdown-single-open.png"
fullPage: trueSelect Option
Tool: browser_click
Parameters:
element: "Option 2"
ref: "1403"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_snapshot
Returns:
combobox "Select option" [ref=1303]
value: "Option 2"Tool: browser_take_screenshot
Parameters:
filename: "dropdown-single-selected.png"
element: "Canvas group"
ref: "1302"Test Multi Select Dropdown
Tool: browser_click
Parameters:
element: "Multi Select story link"
ref: "1306"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_click
Parameters:
element: "Select options dropdown"
ref: "1303"Tool: browser_wait_for
Parameters:
text: "Option 1"Tool: browser_take_screenshot
Parameters:
filename: "dropdown-multi-open.png"
fullPage: trueSelect Multiple Options
Tool: browser_click
Parameters:
element: "Option 1"
ref: "1402"Tool: browser_click
Parameters:
element: "Option 3"
ref: "1404"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_take_screenshot
Parameters:
filename: "dropdown-multi-selected.png"
fullPage: trueTest Searchable Dropdown
Tool: browser_click
Parameters:
element: "Searchable story link"
ref: "1307"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_click
Parameters:
element: "Search dropdown"
ref: "1303"Tool: browser_type
Parameters:
element: "Search field"
ref: "1303"
text: "opt"
slowly: trueTool: browser_wait_for
Parameters:
time: 0.5Tool: browser_snapshot
Returns:
listbox "Filtered Options" [ref=1501]
option "Option 1" [ref=1502]
option "Option 2" [ref=1503]
option "Option 3" [ref=1504]Tool: browser_take_screenshot
Parameters:
filename: "dropdown-searchable-filtered.png"
fullPage: trueStep 7: Accessibility Testing
Test Keyboard Navigation - Button
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-button"Tool: browser_wait_for
Parameters:
text: "Button"Tool: browser_press_key
Parameters:
key: "Tab"Tool: browser_snapshot
Returns:
button "Click me" [ref=202]
focused: trueTool: browser_take_screenshot
Parameters:
filename: "button-keyboard-focus.png"
element: "Canvas group"
ref: "201"Tool: browser_press_key
Parameters:
key: "Enter"Tool: browser_wait_for
Parameters:
time: 0.3Tool: browser_console_messages
Returns:
["Button clicked"]Test ARIA Labels - Input
Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-input--with-error"Tool: browser_wait_for
Parameters:
text: "Input"Tool: browser_snapshot
Returns:
group "Input Field" [ref=502]
label "Email" [ref=503]
for: "email-input"
textbox "Email" [ref=504]
id: "email-input"
aria-invalid: "true"
aria-describedby: "email-error"
text "Please enter a valid email address" [ref=505]
id: "email-error"
role: alertVerify Accessibility Tree
Tool: browser_evaluate
Parameters:
element: "Email textbox"
ref: "504"
function: "(element) => { return { ariaInvalid: element.getAttribute('aria-invalid'), ariaDescribedBy: element.getAttribute('aria-describedby'), id: element.id, role: element.role }; }"
Returns:
{
ariaInvalid: "true",
ariaDescribedBy: "email-error",
id: "email-input",
role: "textbox"
}Step 8: Responsive Component Testing
Test Button Component - Mobile
Tool: browser_resize
Parameters:
width: 375
height: 667Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-button--sizes"Tool: browser_wait_for
Parameters:
text: "Button"Tool: browser_take_screenshot
Parameters:
filename: "button-sizes-mobile-375.png"
element: "Canvas group"
ref: "301"Test Button Component - Tablet
Tool: browser_resize
Parameters:
width: 768
height: 1024Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-button--sizes"Tool: browser_take_screenshot
Parameters:
filename: "button-sizes-tablet-768.png"
element: "Canvas group"
ref: "301"Test Button Component - Desktop
Tool: browser_resize
Parameters:
width: 1920
height: 1080Tool: browser_navigate
Parameters:
url: "https://storybook.example.com/?path=/story/components-button--sizes"Tool: browser_take_screenshot
Parameters:
filename: "button-sizes-desktop-1920.png"
element: "Canvas group"
ref: "301"Results Summary
Components Tested
Button Component (11 screenshots): 1. button-primary-default.png 2. button-primary-hover.png 3. button-primary-focus.png 4. button-primary-disabled.png 5. button-primary-loading.png 6. button-secondary-default.png 7. button-secondary-hover.png 8. button-danger-default.png 9. button-danger-hover.png 10. button-sizes-all.png 11. button-keyboard-focus.png
Input Component (6 screenshots): 12. input-default-empty.png 13. input-default-filled.png 14. input-default-focus.png 15. input-error-state.png 16. input-disabled-state.png 17. input-password-hidden.png 18. input-password-visible.png
Modal Component (5 screenshots): 19. modal-trigger-default.png 20. modal-default-open.png 21. modal-large-open.png 22. modal-alert-open.png 23. modal-keyboard-closed.png
Card Component (5 screenshots): 24. card-default.png 25. card-elevated.png 26. card-outlined.png 27. card-interactive-default.png 28. card-interactive-hover.png
Toast Component (4 screenshots): 29. toast-success.png 30. toast-error.png 31. toast-warning.png 32. toast-info.png
Dropdown Component (6 screenshots): 33. dropdown-single-closed.png 34. dropdown-single-open.png 35. dropdown-single-selected.png 36. dropdown-multi-open.png 37. dropdown-multi-selected.png 38. dropdown-searchable-filtered.png
Responsive Testing (3 screenshots): 39. button-sizes-mobile-375.png 40. button-sizes-tablet-768.png 41. button-sizes-desktop-1920.png
Total: 44 screenshots
Tests Performed
Component States:
- ✅ Default states
- ✅ Hover states
- ✅ Focus states
- ✅ Active/pressed states
- ✅ Disabled states
- ✅ Loading states
- ✅ Error states
- ✅ Success states
Interactions:
- ✅ Click events
- ✅ Hover events
- ✅ Keyboard navigation
- ✅ Form submissions
- ✅ Toggle actions
- ✅ Dropdown selection
- ✅ Modal open/close
Accessibility:
- ✅ ARIA labels present
- ✅ Keyboard navigation working
- ✅ Focus indicators visible
- ✅ Error messages announced
- ✅ Semantic HTML structure
- ✅ Proper heading hierarchy
Responsiveness:
- ✅ Mobile layout (375px)
- ✅ Tablet layout (768px)
- ✅ Desktop layout (1920px)
- ✅ Component scaling appropriate
Component Documentation Generated
Each component now has visual documentation showing:
- All variants (Primary, Secondary, Danger, Ghost)
- All states (Default, Hover, Focus, Disabled, Loading, Error)
- All sizes (Small, Medium, Large)
- Interactive behaviors
- Responsive behavior
- Accessibility features
Issues Found
1. Input Password Toggle: Toggle button could be larger for better touch targets
- Current: ~30x30px
- Recommended: 44x44px minimum
2. Modal Close Button: Position could be more consistent
- Some variants have top-right X
- Others have bottom cancel button
- Recommendation: Standardize across all modal types
Best Practices Demonstrated
1. Comprehensive State Testing: Tested all component states systematically 2. Accessibility Verification: Verified ARIA labels, keyboard navigation 3. Visual Documentation: Captured screenshots of all variants 4. Responsive Testing: Tested component scaling across viewports 5. Interactive Testing: Verified all user interactions work 6. Snapshot Validation: Used snapshots to verify structure 7. Naming Convention: Clear, descriptive screenshot names 8. Organization: Grouped screenshots by component 9. Error Detection: Identified usability issues 10. Documentation Generation: Created visual component catalog
Component Catalog Output
Generated Documentation Structure
components/
Button/
variants/
button-primary-default.png
button-secondary-default.png
button-danger-default.png
states/
button-primary-hover.png
button-primary-focus.png
button-primary-disabled.png
button-primary-loading.png
sizes/
button-sizes-all.png
responsive/
button-sizes-mobile-375.png
button-sizes-tablet-768.png
button-sizes-desktop-1920.png
Input/
states/
input-default-empty.png
input-default-filled.png
input-default-focus.png
input-error-state.png
input-disabled-state.png
variants/
input-password-hidden.png
input-password-visible.png
Modal/
variants/
modal-default-open.png
modal-large-open.png
modal-alert-open.png
Card/
variants/
card-default.png
card-elevated.png
card-outlined.png
states/
card-interactive-default.png
card-interactive-hover.png
Toast/
variants/
toast-success.png
toast-error.png
toast-warning.png
toast-info.png
Dropdown/
variants/
dropdown-single-closed.png
dropdown-single-open.png
dropdown-multi-open.png
dropdown-searchable-filtered.pngNext Steps
1. Visual Regression: Compare against baseline screenshots 2. Cross-Browser: Test on Firefox and WebKit 3. Performance: Measure component render times 4. Dark Mode: Test all components in dark theme 5. Animation Testing: Capture transition states 6. Edge Cases: Test with very long text, special characters 7. Integration: Test components working together 8. Documentation: Generate HTML documentation with screenshots
E-Commerce Site Testing Example
Complete workflow for testing an e-commerce website using Playwright MCP server. This example covers product browsing, shopping cart, checkout process, and visual validation.
Scenario
Testing a production e-commerce site (example.com/shop) to verify:
- Product listing and search functionality
- Product detail page rendering
- Add to cart functionality
- Shopping cart operations
- Checkout flow
- Payment form validation
- Order confirmation
Test Environment Setup
Target URL: https://example.com/shop Test Browsers: Chromium, Firefox, WebKit Viewports: Mobile (375x667), Desktop (1920x1080)
Step 1: Product Listing Page Testing
Navigate and Capture Initial State
Tool: browser_navigate
Parameters:
url: "https://example.com/shop"Tool: browser_wait_for
Parameters:
textGone: "Loading products..."Tool: browser_snapshot
Returns:
heading "Shop" [ref=101]
textbox "Search products" [ref=102]
button "Filter" [ref=103]
list "Products" [ref=104]
listitem "Product 1 - $29.99" [ref=105]
button "Quick View" [ref=106]
button "Add to Cart" [ref=107]
listitem "Product 2 - $49.99" [ref=108]
button "Quick View" [ref=109]
button "Add to Cart" [ref=110]Tool: browser_take_screenshot
Parameters:
filename: "shop-products-desktop.png"
fullPage: trueTest Product Search
Tool: browser_type
Parameters:
element: "Search products textbox"
ref: "102"
text: "wireless headphones"
submit: trueTool: browser_wait_for
Parameters:
text: "Results for"Tool: browser_take_screenshot
Parameters:
filename: "shop-search-results.png"
fullPage: trueTool: browser_snapshot
Returns:
heading "Results for 'wireless headphones'" [ref=201]
text "8 products found" [ref=202]
list "Search Results" [ref=203]
listitem "Bluetooth Headphones - $79.99" [ref=204]
listitem "Gaming Headset - $99.99" [ref=205]Test Product Filtering
Tool: browser_click
Parameters:
element: "Filter button"
ref: "103"Tool: browser_wait_for
Parameters:
text: "Price Range"Tool: browser_snapshot
Returns:
dialog "Filter Products" [ref=301]
heading "Filter Products" [ref=302]
group "Price Range" [ref=303]
slider "Min Price" [ref=304]
slider "Max Price" [ref=305]
group "Category" [ref=306]
checkbox "Electronics" [ref=307]
checkbox "Accessories" [ref=308]
button "Apply Filters" [ref=309]
button "Clear All" [ref=310]Tool: browser_click
Parameters:
element: "Electronics checkbox"
ref: "307"Tool: browser_click
Parameters:
element: "Apply Filters button"
ref: "309"Tool: browser_wait_for
Parameters:
text: "Filters applied"Tool: browser_take_screenshot
Parameters:
filename: "shop-filtered-products.png"
fullPage: trueStep 2: Product Detail Page Testing
Navigate to Product
Tool: browser_click
Parameters:
element: "Bluetooth Headphones product"
ref: "204"Tool: browser_wait_for
Parameters:
text: "Product Details"Tool: browser_snapshot
Returns:
heading "Bluetooth Headphones" [ref=401]
text "$79.99" [ref=402]
img "Product Image" [ref=403]
button "Previous Image" [ref=404]
button "Next Image" [ref=405]
group "Quantity" [ref=406]
button "Decrease" [ref=407]
textbox "Quantity" [ref=408]
button "Increase" [ref=409]
button "Add to Cart" [ref=410]
button "Add to Wishlist" [ref=411]
heading "Description" [ref=412]
text "Premium wireless headphones..." [ref=413]Test Product Image Gallery
Tool: browser_take_screenshot
Parameters:
filename: "product-detail-image-1.png"
element: "Product Image"
ref: "403"Tool: browser_click
Parameters:
element: "Next Image button"
ref: "405"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "product-detail-image-2.png"
element: "Product Image"
ref: "403"Test Quantity Selection
Tool: browser_click
Parameters:
element: "Increase quantity button"
ref: "409"Tool: browser_click
Parameters:
element: "Increase quantity button"
ref: "409"Tool: browser_snapshot
Returns:
textbox "Quantity" [ref=408]
value: "3"Tool: browser_take_screenshot
Parameters:
filename: "product-quantity-updated.png"Add to Cart
Tool: browser_click
Parameters:
element: "Add to Cart button"
ref: "410"Tool: browser_wait_for
Parameters:
text: "Added to cart"Tool: browser_take_screenshot
Parameters:
filename: "product-added-to-cart.png"Tool: browser_snapshot
Returns:
alert "Added to cart" [ref=501]
text "3 items added successfully" [ref=502]
button "View Cart" [ref=503]
button "Continue Shopping" [ref=504]Step 3: Shopping Cart Testing
Open Cart
Tool: browser_click
Parameters:
element: "View Cart button"
ref: "503"Tool: browser_wait_for
Parameters:
text: "Shopping Cart"Tool: browser_snapshot
Returns:
heading "Shopping Cart" [ref=601]
text "3 items" [ref=602]
list "Cart Items" [ref=603]
listitem "Bluetooth Headphones" [ref=604]
img "Product thumbnail" [ref=605]
text "Quantity: 3" [ref=606]
text "Price: $79.99 each" [ref=607]
text "Subtotal: $239.97" [ref=608]
button "Update" [ref=609]
button "Remove" [ref=610]
group "Cart Summary" [ref=611]
text "Subtotal: $239.97" [ref=612]
text "Shipping: $9.99" [ref=613]
text "Tax: $24.00" [ref=614]
text "Total: $273.96" [ref=615]
button "Continue Shopping" [ref=616]
button "Proceed to Checkout" [ref=617]Tool: browser_take_screenshot
Parameters:
filename: "shopping-cart-full.png"
fullPage: trueTest Quantity Update
Tool: browser_click
Parameters:
element: "Update quantity button"
ref: "609"Tool: browser_wait_for
Parameters:
text: "Update quantity"Tool: browser_snapshot
Returns:
dialog "Update Quantity" [ref=701]
textbox "New quantity" [ref=702]
button "Update" [ref=703]
button "Cancel" [ref=704]Tool: browser_type
Parameters:
element: "New quantity textbox"
ref: "702"
text: "2"Tool: browser_click
Parameters:
element: "Update button"
ref: "703"Tool: browser_wait_for
Parameters:
text: "Cart updated"Tool: browser_take_screenshot
Parameters:
filename: "cart-quantity-updated.png"Test Remove Item
Tool: browser_navigate_backTool: browser_click
Parameters:
element: "Add to Cart button"
ref: "410"Tool: browser_wait_for
Parameters:
text: "Added to cart"Tool: browser_click
Parameters:
element: "View Cart button"
ref: "503"Tool: browser_snapshotTool: browser_click
Parameters:
element: "Remove item button"
ref: "610"Tool: browser_handle_dialog
Parameters:
accept: trueTool: browser_wait_for
Parameters:
text: "Item removed"Tool: browser_take_screenshot
Parameters:
filename: "cart-item-removed.png"Step 4: Checkout Process Testing
Navigate to Checkout
Tool: browser_click
Parameters:
element: "Proceed to Checkout button"
ref: "617"Tool: browser_wait_for
Parameters:
text: "Checkout"Tool: browser_snapshot
Returns:
heading "Checkout" [ref=801]
group "Step 1: Shipping Information" [ref=802]
textbox "Full Name" [ref=803]
textbox "Email" [ref=804]
textbox "Phone" [ref=805]
textbox "Address Line 1" [ref=806]
textbox "Address Line 2" [ref=807]
textbox "City" [ref=808]
combobox "State" [ref=809]
textbox "Zip Code" [ref=810]
button "Continue to Payment" [ref=811]Tool: browser_take_screenshot
Parameters:
filename: "checkout-step1-shipping.png"
fullPage: trueFill Shipping Information
Tool: browser_fill_form
Parameters:
fields: [
{
name: "Full Name",
type: "textbox",
ref: "803",
value: "John Doe"
},
{
name: "Email",
type: "textbox",
ref: "804",
value: "john.doe@example.com"
},
{
name: "Phone",
type: "textbox",
ref: "805",
value: "555-0123"
},
{
name: "Address Line 1",
type: "textbox",
ref: "806",
value: "123 Main Street"
},
{
name: "City",
type: "textbox",
ref: "808",
value: "New York"
},
{
name: "Zip Code",
type: "textbox",
ref: "810",
value: "10001"
}
]Tool: browser_select_option
Parameters:
element: "State dropdown"
ref: "809"
values: ["New York"]Tool: browser_take_screenshot
Parameters:
filename: "checkout-shipping-filled.png"
fullPage: trueTest Validation
Tool: browser_type
Parameters:
element: "Email textbox"
ref: "804"
text: "invalid-email"Tool: browser_click
Parameters:
element: "Continue to Payment button"
ref: "811"Tool: browser_wait_for
Parameters:
text: "Please enter a valid email"Tool: browser_snapshot
Returns:
text "Please enter a valid email" [ref=901]
role: alertTool: browser_take_screenshot
Parameters:
filename: "checkout-validation-error.png"Fix and Continue
Tool: browser_type
Parameters:
element: "Email textbox"
ref: "804"
text: "john.doe@example.com"Tool: browser_click
Parameters:
element: "Continue to Payment button"
ref: "811"Tool: browser_wait_for
Parameters:
text: "Payment Information"Step 5: Payment Form Testing
Tool: browser_snapshot
Returns:
heading "Step 2: Payment Information" [ref=1001]
group "Payment Method" [ref=1002]
radio "Credit Card" [ref=1003] checked
radio "PayPal" [ref=1004]
radio "Apple Pay" [ref=1005]
group "Card Details" [ref=1006]
textbox "Card Number" [ref=1007]
textbox "Cardholder Name" [ref=1008]
textbox "Expiry Date (MM/YY)" [ref=1009]
textbox "CVV" [ref=1010]
checkbox "Save card for future purchases" [ref=1011]
button "Review Order" [ref=1012]Tool: browser_take_screenshot
Parameters:
filename: "checkout-step2-payment.png"
fullPage: trueFill Payment Information
Tool: browser_fill_form
Parameters:
fields: [
{
name: "Card Number",
type: "textbox",
ref: "1007",
value: "4111111111111111"
},
{
name: "Cardholder Name",
type: "textbox",
ref: "1008",
value: "John Doe"
},
{
name: "Expiry Date",
type: "textbox",
ref: "1009",
value: "12/25"
},
{
name: "CVV",
type: "textbox",
ref: "1010",
value: "123"
},
{
name: "Save card",
type: "checkbox",
ref: "1011",
value: "true"
}
]Tool: browser_take_screenshot
Parameters:
filename: "checkout-payment-filled.png"
fullPage: trueReview Order
Tool: browser_click
Parameters:
element: "Review Order button"
ref: "1012"Tool: browser_wait_for
Parameters:
text: "Review Your Order"Tool: browser_snapshot
Returns:
heading "Step 3: Review Your Order" [ref=1101]
group "Shipping Address" [ref=1102]
text "John Doe" [ref=1103]
text "123 Main Street" [ref=1104]
text "New York, NY 10001" [ref=1105]
button "Edit" [ref=1106]
group "Payment Method" [ref=1107]
text "Credit Card ending in 1111" [ref=1108]
button "Edit" [ref=1109]
group "Order Summary" [ref=1110]
list "Order Items" [ref=1111]
listitem "Bluetooth Headphones (2) - $159.98" [ref=1112]
text "Subtotal: $159.98" [ref=1113]
text "Shipping: $9.99" [ref=1114]
text "Tax: $16.00" [ref=1115]
text "Total: $185.97" [ref=1116]
button "Place Order" [ref=1117]Tool: browser_take_screenshot
Parameters:
filename: "checkout-step3-review.png"
fullPage: trueStep 6: Order Placement and Confirmation
Place Order
Tool: browser_click
Parameters:
element: "Place Order button"
ref: "1117"Tool: browser_wait_for
Parameters:
text: "Processing order"Tool: browser_take_screenshot
Parameters:
filename: "order-processing.png"Tool: browser_wait_for
Parameters:
text: "Order Confirmed"Tool: browser_snapshot
Returns:
heading "Order Confirmed!" [ref=1201]
text "Thank you for your purchase" [ref=1202]
text "Order Number: #12345" [ref=1203]
text "Confirmation email sent to john.doe@example.com" [ref=1204]
group "Order Details" [ref=1205]
text "Expected Delivery: Oct 25, 2025" [ref=1206]
text "Total Paid: $185.97" [ref=1207]
button "View Order Details" [ref=1208]
button "Continue Shopping" [ref=1209]Tool: browser_take_screenshot
Parameters:
filename: "order-confirmed.png"
fullPage: trueVerify Network Activity
Tool: browser_network_requests
Returns:
[
{
url: "https://example.com/api/checkout",
method: "POST",
status: 200,
response: {
orderId: "12345",
status: "confirmed",
total: 185.97
}
},
{
url: "https://example.com/api/payment/process",
method: "POST",
status: 200,
response: {
transactionId: "txn_abc123",
status: "success"
}
},
{
url: "https://example.com/api/email/confirmation",
method: "POST",
status: 200
}
]Check Console Messages
Tool: browser_console_messages
Parameters:
onlyErrors: true
Returns:
[No errors found]Step 7: Responsive Testing - Mobile
Resize to Mobile
Tool: browser_resize
Parameters:
width: 375
height: 667Navigate to Shop
Tool: browser_navigate
Parameters:
url: "https://example.com/shop"Tool: browser_wait_for
Parameters:
textGone: "Loading products..."Tool: browser_snapshot
Returns:
button "Menu" [ref=1301]
heading "Shop" [ref=1302]
button "Search" [ref=1303]
list "Products" [ref=1304]
listitem "Product Card (Mobile)" [ref=1305]Tool: browser_take_screenshot
Parameters:
filename: "shop-mobile-view.png"
fullPage: trueTest Mobile Navigation
Tool: browser_click
Parameters:
element: "Menu button"
ref: "1301"Tool: browser_wait_for
Parameters:
text: "Navigation"Tool: browser_snapshot
Returns:
navigation "Mobile Menu" [ref=1401]
link "Home" [ref=1402]
link "Shop" [ref=1403]
link "Cart" [ref=1404]
link "Account" [ref=1405]
button "Close Menu" [ref=1406]Tool: browser_take_screenshot
Parameters:
filename: "mobile-menu-open.png"
fullPage: trueTest Mobile Product View
Tool: browser_click
Parameters:
element: "Close Menu button"
ref: "1406"Tool: browser_click
Parameters:
element: "Product Card"
ref: "1305"Tool: browser_wait_for
Parameters:
text: "Product Details"Tool: browser_take_screenshot
Parameters:
filename: "product-detail-mobile.png"
fullPage: trueTest Mobile Cart
Tool: browser_click
Parameters:
element: "Add to Cart button"
ref: "410"Tool: browser_wait_for
Parameters:
text: "Added to cart"Tool: browser_take_screenshot
Parameters:
filename: "mobile-cart-notification.png"Results Summary
Screenshots Captured
Desktop (1920x1080): 1. shop-products-desktop.png - Product listing page 2. shop-search-results.png - Search functionality 3. shop-filtered-products.png - Applied filters 4. product-detail-image-1.png - Product image gallery 5. product-added-to-cart.png - Add to cart confirmation 6. shopping-cart-full.png - Cart with items 7. cart-quantity-updated.png - Updated quantities 8. cart-item-removed.png - Item removal 9. checkout-step1-shipping.png - Shipping form 10. checkout-shipping-filled.png - Completed shipping 11. checkout-validation-error.png - Validation errors 12. checkout-step2-payment.png - Payment form 13. checkout-payment-filled.png - Completed payment 14. checkout-step3-review.png - Order review 15. order-processing.png - Processing state 16. order-confirmed.png - Confirmation page
Mobile (375x667): 17. shop-mobile-view.png - Mobile product listing 18. mobile-menu-open.png - Mobile navigation 19. product-detail-mobile.png - Mobile product view 20. mobile-cart-notification.png - Mobile cart feedback
Tests Performed
- Product search functionality: ✅ Passed
- Product filtering: ✅ Passed
- Product image gallery: ✅ Passed
- Quantity selection: ✅ Passed
- Add to cart: ✅ Passed
- Cart update: ✅ Passed
- Cart remove item: ✅ Passed
- Checkout shipping form: ✅ Passed
- Form validation: ✅ Passed
- Payment form: ✅ Passed
- Order review: ✅ Passed
- Order placement: ✅ Passed
- Mobile responsive layout: ✅ Passed
- Mobile navigation: ✅ Passed
Network Activity
- All API calls returned 200 status
- No failed network requests
- Payment processing successful
- Confirmation email sent
Console Messages
- No JavaScript errors detected
- No console warnings
- Clean execution
Best Practices Demonstrated
1. Wait for dynamic content: Used browser_wait_for consistently 2. Snapshot before interaction: Always captured snapshot to get refs 3. Screenshot critical states: Documented each major step 4. Test validation: Verified error states and validation 5. Mobile testing: Tested responsive layouts 6. Network verification: Checked API calls and responses 7. Console monitoring: Verified no JavaScript errors 8. Descriptive filenames: Used clear naming convention 9. Full workflow: Tested complete user journey 10. Error handling: Tested and documented error states
Next Steps
1. Visual regression: Compare screenshots against baselines 2. Cross-browser: Repeat tests on Firefox and WebKit 3. Performance: Monitor page load times and network timing 4. Accessibility: Verify ARIA labels and keyboard navigation 5. Error scenarios: Test network failures and timeouts 6. Edge cases: Test with maximum quantities, special characters 7. Integration: Add to CI/CD pipeline for automated testing
Responsive Design Testing Example
Complete workflow for testing responsive web design across multiple viewports using Playwright MCP server. This example validates layout, navigation, and functionality across mobile, tablet, and desktop devices.
Scenario
Testing a marketing website (example.com) to verify:
- Responsive layout at different breakpoints
- Mobile navigation menu behavior
- Touch-friendly interactive elements
- Image scaling and optimization
- Typography and readability
- Form usability across devices
- Content reflow and stacking
Test Viewports
Mobile Devices:
- iPhone SE: 375 x 667 (Small mobile)
- iPhone 14 Pro: 393 x 852 (Standard mobile)
- Pixel 7: 412 x 915 (Large mobile)
Tablets:
- iPad Mini: 768 x 1024 (Small tablet portrait)
- iPad Pro 11": 834 x 1194 (Medium tablet portrait)
- iPad Pro 12.9": 1024 x 1366 (Large tablet portrait)
Desktop:
- Laptop: 1366 x 768 (Small laptop)
- Desktop HD: 1920 x 1080 (Full HD)
- Desktop 2K: 2560 x 1440 (High resolution)
Step 1: Mobile Testing (iPhone SE - 375x667)
Setup Mobile Viewport
Tool: browser_resize
Parameters:
width: 375
height: 667Navigate to Homepage
Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_wait_for
Parameters:
textGone: "Loading..."Capture Mobile Layout
Tool: browser_snapshot
Returns:
banner "Mobile Header" [ref=101]
button "Menu" [ref=102]
img "Logo" [ref=103]
button "Search" [ref=104]
main "Content" [ref=105]
heading "Welcome to Example" [ref=106]
text "Building great products..." [ref=107]
button "Get Started" [ref=108]
img "Hero Image Mobile" [ref=109]
group "Features" [ref=110]
article "Feature 1" [ref=111]
img "Icon 1" [ref=112]
heading "Fast" [ref=113]
text "Lightning quick performance" [ref=114]
article "Feature 2" [ref=115]
article "Feature 3" [ref=116]Tool: browser_take_screenshot
Parameters:
filename: "homepage-mobile-375.png"
fullPage: trueTest Mobile Navigation
Tool: browser_click
Parameters:
element: "Menu button"
ref: "102"Tool: browser_wait_for
Parameters:
text: "Navigation"Tool: browser_snapshot
Returns:
navigation "Mobile Menu Drawer" [ref=201]
button "Close" [ref=202]
list "Menu Items" [ref=203]
link "Home" [ref=204]
link "Features" [ref=205]
link "Pricing" [ref=206]
link "About" [ref=207]
link "Contact" [ref=208]
button "Sign In" [ref=209]
button "Sign Up" [ref=210]Tool: browser_take_screenshot
Parameters:
filename: "mobile-menu-open-375.png"
fullPage: trueVerify Touch-Friendly Buttons
Tool: browser_snapshot
Note: Verify button sizes
- Menu button: Should be at least 44x44px (touch-friendly)
- Get Started button: Should be large and prominent
- Navigation links: Should have adequate spacingTool: browser_evaluate
Parameters:
element: "Menu button"
ref: "102"
function: "(element) => { const rect = element.getBoundingClientRect(); return { width: rect.width, height: rect.height }; }"
Returns:
{ width: 48, height: 48 }Close Menu and Test Scroll
Tool: browser_click
Parameters:
element: "Close button"
ref: "202"Tool: browser_evaluate
Parameters:
function: "() => { window.scrollTo(0, 500); }"Tool: browser_wait_for
Parameters:
time: 1Tool: browser_take_screenshot
Parameters:
filename: "mobile-scrolled-375.png"Step 2: Tablet Testing (iPad - 768x1024)
Resize to Tablet
Tool: browser_resize
Parameters:
width: 768
height: 1024Navigate to Homepage
Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_wait_for
Parameters:
textGone: "Loading..."Capture Tablet Layout
Tool: browser_snapshot
Returns:
banner "Tablet Header" [ref=301]
img "Logo" [ref=302]
navigation "Main Nav" [ref=303]
link "Features" [ref=304]
link "Pricing" [ref=305]
link "About" [ref=306]
link "Contact" [ref=307]
button "Sign In" [ref=308]
button "Sign Up" [ref=309]
main "Content" [ref=310]
group "Hero Section" [ref=311]
heading "Welcome to Example" [ref=312]
text "Building great products..." [ref=313]
button "Get Started" [ref=314]
img "Hero Image Tablet" [ref=315]
group "Features Grid" [ref=316]
article "Feature 1" [ref=317]
article "Feature 2" [ref=318]
article "Feature 3" [ref=319]Tool: browser_take_screenshot
Parameters:
filename: "homepage-tablet-768.png"
fullPage: trueVerify Layout Differences
Key observations:
- No hamburger menu (navigation visible in header)
- Hero image different aspect ratio
- Features displayed in 2-column grid (vs stacked on mobile)
- Buttons in header visible (not hidden in menu)
Test Navigation (No Menu Button)
Tool: browser_click
Parameters:
element: "Features link"
ref: "304"Tool: browser_wait_for
Parameters:
text: "Features"Tool: browser_take_screenshot
Parameters:
filename: "features-page-tablet-768.png"
fullPage: trueStep 3: Desktop Testing (1920x1080)
Resize to Desktop
Tool: browser_resize
Parameters:
width: 1920
height: 1080Navigate to Homepage
Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_wait_for
Parameters:
textGone: "Loading..."Capture Desktop Layout
Tool: browser_snapshot
Returns:
banner "Desktop Header" [ref=401]
img "Logo Large" [ref=402]
navigation "Main Navigation" [ref=403]
link "Features" [ref=404]
link "Pricing" [ref=405]
link "About" [ref=406]
link "Contact" [ref=407]
link "Blog" [ref=408]
group "User Actions" [ref=409]
button "Sign In" [ref=410]
button "Sign Up" [ref=411]
main "Hero Section" [ref=412]
group "Hero Content" [ref=413]
heading "Welcome to Example" [ref=414]
text "Building great products for modern teams" [ref=415]
button "Get Started Free" [ref=416]
button "Watch Demo" [ref=417]
img "Hero Image Desktop" [ref=418]
group "Features Section" [ref=419]
heading "Why Choose Us" [ref=420]
grid "Features" [ref=421]
article "Feature 1" [ref=422]
article "Feature 2" [ref=423]
article "Feature 3" [ref=424]
article "Feature 4" [ref=425]
article "Feature 5" [ref=426]
article "Feature 6" [ref=427]Tool: browser_take_screenshot
Parameters:
filename: "homepage-desktop-1920.png"
fullPage: trueVerify Desktop Layout
Key observations:
- Full navigation visible with all links
- Hero section side-by-side layout (text left, image right)
- Features in 3-column grid
- Additional "Blog" link visible
- "Watch Demo" button visible (hidden on mobile)
- Larger typography and spacing
Test Hover States
Tool: browser_hover
Parameters:
element: "Features link"
ref: "404"Tool: browser_wait_for
Parameters:
time: 0.5Tool: browser_take_screenshot
Parameters:
filename: "desktop-nav-hover-1920.png"
element: "Main Navigation"
ref: "403"Tool: browser_hover
Parameters:
element: "Get Started Free button"
ref: "416"Tool: browser_take_screenshot
Parameters:
filename: "desktop-cta-hover-1920.png"
element: "Get Started Free button"
ref: "416"Step 4: Form Testing Across Viewports
Mobile Form (375x667)
Tool: browser_resize
Parameters:
width: 375
height: 667Tool: browser_navigate
Parameters:
url: "https://example.com/contact"Tool: browser_wait_for
Parameters:
text: "Contact Us"Tool: browser_snapshot
Returns:
heading "Contact Us" [ref=501]
form "Contact Form" [ref=502]
textbox "Name" [ref=503]
placeholder: "Your name"
textbox "Email" [ref=504]
placeholder: "your@email.com"
textbox "Phone" [ref=505]
placeholder: "Optional"
combobox "Subject" [ref=506]
textbox "Message" [ref=507]
multiline: true
button "Send Message" [ref=508]Tool: browser_take_screenshot
Parameters:
filename: "contact-form-mobile-375.png"
fullPage: trueFill Mobile Form
Tool: browser_fill_form
Parameters:
fields: [
{
name: "Name",
type: "textbox",
ref: "503",
value: "Jane Smith"
},
{
name: "Email",
type: "textbox",
ref: "504",
value: "jane@example.com"
},
{
name: "Phone",
type: "textbox",
ref: "505",
value: "555-0199"
}
]Tool: browser_select_option
Parameters:
element: "Subject dropdown"
ref: "506"
values: ["General Inquiry"]Tool: browser_type
Parameters:
element: "Message textbox"
ref: "507"
text: "I would like to learn more about your services."Tool: browser_take_screenshot
Parameters:
filename: "contact-form-filled-mobile-375.png"
fullPage: trueDesktop Form (1920x1080)
Tool: browser_resize
Parameters:
width: 1920
height: 1080Tool: browser_navigate
Parameters:
url: "https://example.com/contact"Tool: browser_wait_for
Parameters:
text: "Contact Us"Tool: browser_snapshot
Returns:
group "Contact Page Layout" [ref=601]
group "Form Section" [ref=602]
heading "Get in Touch" [ref=603]
form "Contact Form" [ref=604]
group "Name and Email Row" [ref=605]
textbox "Name" [ref=606]
textbox "Email" [ref=607]
group "Phone and Subject Row" [ref=608]
textbox "Phone" [ref=609]
combobox "Subject" [ref=610]
textbox "Message" [ref=611]
multiline: true
button "Send Message" [ref=612]
group "Contact Info" [ref=613]
heading "Contact Information" [ref=614]
text "Email: info@example.com" [ref=615]
text "Phone: 1-800-555-0100" [ref=616]
text "Address: 123 Main St" [ref=617]Tool: browser_take_screenshot
Parameters:
filename: "contact-form-desktop-1920.png"
fullPage: trueLayout observations:
- Mobile: Stacked single-column form
- Desktop: Two-column layout with form on left, contact info on right
- Desktop: Name/Email in same row, Phone/Subject in same row
- Mobile: All fields full-width, stacked vertically
Step 5: Image Responsiveness Testing
Test at Different Viewports
Mobile (375x667):
Tool: browser_resize
Parameters:
width: 375
height: 667Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_wait_for
Parameters:
textGone: "Loading..."Tool: browser_evaluate
Parameters:
element: "Hero Image Mobile"
ref: "109"
function: "(element) => { const img = element; return { src: img.src, width: img.width, height: img.height, naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight }; }"
Returns:
{
src: "https://example.com/images/hero-mobile-375.jpg",
width: 375,
height: 250,
naturalWidth: 750,
naturalHeight: 500
}Tool: browser_take_screenshot
Parameters:
filename: "hero-image-mobile-375.png"
element: "Hero Image Mobile"
ref: "109"Tablet (768x1024):
Tool: browser_resize
Parameters:
width: 768
height: 1024Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_evaluate
Parameters:
element: "Hero Image Tablet"
ref: "315"
function: "(element) => { const img = element; return { src: img.src, width: img.width, height: img.height, naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight }; }"
Returns:
{
src: "https://example.com/images/hero-tablet-768.jpg",
width: 768,
height: 400,
naturalWidth: 1536,
naturalHeight: 800
}Tool: browser_take_screenshot
Parameters:
filename: "hero-image-tablet-768.png"
element: "Hero Image Tablet"
ref: "315"Desktop (1920x1080):
Tool: browser_resize
Parameters:
width: 1920
height: 1080Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_evaluate
Parameters:
element: "Hero Image Desktop"
ref: "418"
function: "(element) => { const img = element; return { src: img.src, width: img.width, height: img.height, naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight }; }"
Returns:
{
src: "https://example.com/images/hero-desktop-1920.jpg",
width: 960,
height: 640,
naturalWidth: 1920,
naturalHeight: 1280
}Tool: browser_take_screenshot
Parameters:
filename: "hero-image-desktop-1920.png"
element: "Hero Image Desktop"
ref: "418"Verification:
- ✅ Different image sources per viewport (optimized images)
- ✅ Appropriate image dimensions
- ✅ 2x resolution for retina displays
- ✅ Proper aspect ratios maintained
Step 6: Typography and Readability Testing
Mobile Typography (375x667)
Tool: browser_resize
Parameters:
width: 375
height: 667Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_evaluate
Parameters:
element: "Welcome heading"
ref: "106"
function: "(element) => { const styles = getComputedStyle(element); return { fontSize: styles.fontSize, lineHeight: styles.lineHeight, fontWeight: styles.fontWeight }; }"
Returns:
{
fontSize: "32px",
lineHeight: "38px",
fontWeight: "700"
}Tool: browser_evaluate
Parameters:
element: "Body text"
ref: "107"
function: "(element) => { const styles = getComputedStyle(element); return { fontSize: styles.fontSize, lineHeight: styles.lineHeight }; }"
Returns:
{
fontSize: "16px",
lineHeight: "24px"
}Desktop Typography (1920x1080)
Tool: browser_resize
Parameters:
width: 1920
height: 1080Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_evaluate
Parameters:
element: "Welcome heading"
ref: "414"
function: "(element) => { const styles = getComputedStyle(element); return { fontSize: styles.fontSize, lineHeight: styles.lineHeight, fontWeight: styles.fontWeight }; }"
Returns:
{
fontSize: "56px",
lineHeight: "64px",
fontWeight: "700"
}Tool: browser_evaluate
Parameters:
element: "Body text"
ref: "415"
function: "(element) => { const styles = getComputedStyle(element); return { fontSize: styles.fontSize, lineHeight: styles.lineHeight }; }"
Returns:
{
fontSize: "18px",
lineHeight: "28px"
}Typography Scaling:
- Mobile heading: 32px
- Desktop heading: 56px (75% larger)
- Mobile body: 16px
- Desktop body: 18px (12.5% larger)
- ✅ Appropriate scaling for readability
Step 7: Breakpoint Validation
Test Key Breakpoints
320px (Very small mobile):
Tool: browser_resize
Parameters:
width: 320
height: 568Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-320.png"
fullPage: true480px (Small mobile landscape):
Tool: browser_resize
Parameters:
width: 480
height: 320Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-480.png"
fullPage: true640px (Phablet):
Tool: browser_resize
Parameters:
width: 640
height: 1136Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-640.png"
fullPage: true768px (Tablet portrait):
Tool: browser_resize
Parameters:
width: 768
height: 1024Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-768.png"
fullPage: true1024px (Tablet landscape / Small laptop):
Tool: browser_resize
Parameters:
width: 1024
height: 768Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-1024.png"
fullPage: true1280px (Standard laptop):
Tool: browser_resize
Parameters:
width: 1280
height: 720Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-1280.png"
fullPage: true1920px (Full HD desktop):
Tool: browser_resize
Parameters:
width: 1920
height: 1080Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-1920.png"
fullPage: true2560px (2K desktop):
Tool: browser_resize
Parameters:
width: 2560
height: 1440Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "homepage-breakpoint-2560.png"
fullPage: trueStep 8: Landscape vs Portrait Testing
Mobile Portrait (iPhone 14 Pro)
Tool: browser_resize
Parameters:
width: 393
height: 852Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "mobile-portrait-393x852.png"
fullPage: trueMobile Landscape
Tool: browser_resize
Parameters:
width: 852
height: 393Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "mobile-landscape-852x393.png"
fullPage: trueTablet Portrait (iPad Pro 11")
Tool: browser_resize
Parameters:
width: 834
height: 1194Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "tablet-portrait-834x1194.png"
fullPage: trueTablet Landscape
Tool: browser_resize
Parameters:
width: 1194
height: 834Tool: browser_navigate
Parameters:
url: "https://example.com"Tool: browser_take_screenshot
Parameters:
filename: "tablet-landscape-1194x834.png"
fullPage: trueResults Summary
Screenshots Captured by Category
Mobile Viewports (7 screenshots): 1. homepage-mobile-375.png 2. mobile-menu-open-375.png 3. mobile-scrolled-375.png 4. contact-form-mobile-375.png 5. contact-form-filled-mobile-375.png 6. hero-image-mobile-375.png 7. mobile-portrait-393x852.png
Tablet Viewports (5 screenshots): 8. homepage-tablet-768.png 9. features-page-tablet-768.png 10. contact-form-tablet-768.png 11. hero-image-tablet-768.png 12. tablet-portrait-834x1194.png
Desktop Viewports (6 screenshots): 13. homepage-desktop-1920.png 14. desktop-nav-hover-1920.png 15. desktop-cta-hover-1920.png 16. contact-form-desktop-1920.png 17. hero-image-desktop-1920.png 18. desktop-breakpoint-1920.png
Breakpoint Testing (8 screenshots): 19. homepage-breakpoint-320.png 20. homepage-breakpoint-480.png 21. homepage-breakpoint-640.png 22. homepage-breakpoint-768.png 23. homepage-breakpoint-1024.png 24. homepage-breakpoint-1280.png 25. homepage-breakpoint-1920.png 26. homepage-breakpoint-2560.png
Orientation Testing (4 screenshots): 27. mobile-portrait-393x852.png 28. mobile-landscape-852x393.png 29. tablet-portrait-834x1194.png 30. tablet-landscape-1194x834.png
Responsive Features Verified
Layout Adaptations:
- ✅ Mobile: Single column, stacked layout
- ✅ Tablet: Two-column layout, visible navigation
- ✅ Desktop: Three-column grid, full navigation
- ✅ Proper content reflow at breakpoints
Navigation:
- ✅ Mobile: Hamburger menu with drawer
- ✅ Tablet/Desktop: Horizontal navigation bar
- ✅ Touch-friendly button sizes (48x48px minimum)
Images:
- ✅ Responsive images with appropriate sources
- ✅ Optimized for each viewport
- ✅ 2x resolution for retina displays
- ✅ Proper aspect ratios maintained
Typography:
- ✅ Readable font sizes at all viewports
- ✅ Appropriate line height
- ✅ Scaled headings for emphasis
- ✅ Consistent vertical rhythm
Forms:
- ✅ Mobile: Full-width, stacked fields
- ✅ Desktop: Multi-column layout
- ✅ Touch-friendly input sizes
- ✅ Proper keyboard types on mobile
Breakpoints:
- ✅ 320px: Very small mobile
- ✅ 480px: Small mobile landscape
- ✅ 640px: Large mobile
- ✅ 768px: Tablet portrait
- ✅ 1024px: Tablet landscape
- ✅ 1280px: Laptop
- ✅ 1920px: Desktop
- ✅ 2560px: Large desktop
Issues Found
None - All responsive behaviors working as expected.
Best Practices Demonstrated
1. Systematic Testing: Tested major viewport categories 2. Breakpoint Validation: Verified all CSS breakpoints 3. Orientation Testing: Checked portrait and landscape 4. Touch Targets: Verified minimum 44x44px sizes 5. Image Optimization: Confirmed responsive images 6. Typography Scaling: Verified readable sizes 7. Layout Reflow: Confirmed proper content stacking 8. Navigation Patterns: Verified appropriate UI per device 9. Form Usability: Tested form layouts across devices 10. Screenshot Organization: Clear naming convention
Recommendations
1. Performance: Test image loading times at each viewport 2. Accessibility: Verify touch target spacing 3. Content Priority: Ensure critical content visible on mobile 4. Progressive Enhancement: Test with JavaScript disabled 5. Network Throttling: Test on slow connections 6. Device Testing: Test on real devices when possible
Playwright Visual Testing & Browser Automation Skill
A comprehensive Claude skill for browser automation and visual testing using Playwright MCP server integration. Master visual regression testing, automated UI validation, and cross-browser testing for modern web applications.
Overview
This skill transforms Claude into a Playwright expert, enabling automated browser testing, visual regression detection, and comprehensive UI validation. Built from extensive Playwright documentation and real-world testing patterns, this skill provides battle-tested workflows for web application quality assurance.
What This Skill Does
The Playwright Visual Testing skill teaches Claude to:
- Automate browser interactions: Navigate, click, type, and interact with web pages programmatically
- Capture visual states: Take screenshots of full pages, viewports, or specific elements
- Test responsively: Validate layouts across mobile, tablet, and desktop viewports
- Verify accessibility: Use semantic snapshots to ensure proper page structure
- Debug effectively: Capture console messages, network requests, and page state
- Test cross-browser: Validate consistency across Chromium, Firefox, and WebKit
- Automate workflows: Test complete user journeys from start to finish
- Visual regression testing: Compare screenshots to detect unintended changes
When to Use This Skill
Use this skill when:
- Testing web applications before deployment
- Implementing visual regression testing in CI/CD
- Validating responsive designs across devices
- Testing forms and user interactions
- Debugging browser-specific issues
- Creating automated E2E test suites
- Capturing screenshots for documentation
- Testing PWAs and single-page applications
- Verifying accessibility compliance
- Testing cross-browser compatibility
- Validating UI component libraries
- Automating QA workflows
Key Features
1. Comprehensive Tool Reference
Every Playwright MCP server tool documented with:
- Required and optional parameters
- Detailed usage examples
- Return data structures
- Common patterns
- Best practices
- Error handling strategies
Tools Covered:
- Browser lifecycle (navigate, close, resize)
- Page inspection (snapshot, screenshot)
- User interactions (click, type, fill forms, drag)
- Advanced operations (JavaScript evaluation, file uploads)
- Debugging (console messages, network requests)
- Tab management
- Dialog handling
- Wait strategies
2. Visual Testing Workflow Patterns
Proven patterns for:
- Basic Visual Regression: Compare page screenshots over time
- Responsive Design Testing: Validate across multiple viewports
- Form Testing: Test validation, submission, and error states
- Element-Specific Testing: Test individual component states
- Cross-Browser Testing: Ensure consistency across browsers
- E2E User Journeys: Test complete workflows
- Accessibility Testing: Verify semantic structure and keyboard navigation
3. Development Acceleration Strategies
- Test Templates: Reusable patterns for common scenarios
- Screenshot Organization: Systematic file structure and naming
- Parallel Testing: Multi-browser test execution
- Visual Regression Automation: Automated comparison workflows
- Component Library Testing: Design system validation
4. Best Practices
Comprehensive guidance on:
- Screenshot Strategies: Naming, formats, organization
- Snapshot vs Screenshot: When to use each approach
- Waiting Strategies: Reliable element interaction
- Form Testing: Validation and submission patterns
- Network Monitoring: API call verification
- Debugging Workflows: Systematic issue resolution
5. Practical Examples
10+ detailed examples covering:
- Homepage visual regression
- Login form testing
- Responsive design validation
- Component state testing
- E2E checkout flows
- Accessibility testing
- Network debugging
- Dialog handling
- Tab management
- Animation testing
Skill Contents
Core Documentation
- SKILL.md (20KB+): Complete Playwright MCP reference with:
- All 25+ Playwright MCP tools documented
- Visual testing workflow patterns
- Browser automation best practices
- Development acceleration strategies
- Comprehensive troubleshooting guide
- 10+ practical examples
- Quick reference section
Example Workflows
The examples/ directory contains detailed workflow guides:
1. e-commerce-testing.md: Complete e-commerce site testing
- Product browsing and search
- Shopping cart functionality
- Checkout process
- Payment flows
- Order confirmation
2. responsive-testing.md: Responsive design validation
- Mobile layout testing
- Tablet breakpoint validation
- Desktop viewport testing
- Cross-device consistency
3. component-library.md: Design system testing
- Component state validation
- Visual regression for components
- Accessibility verification
- Documentation generation
How to Use This Skill
Installation
1. Copy the playwright-visual-testing folder to your Claude skills directory:
~/Library/Application Support/Claude/skills/playwright-visual-testing/2. Ensure Playwright MCP server is configured in your MCP settings
3. Claude will automatically detect and load the skill when relevant
Invoking the Skill
The skill activates automatically when you:
- Mention Playwright or browser automation
- Ask about visual testing or screenshots
- Discuss E2E testing or QA workflows
- Request help with browser debugging
- Need cross-browser testing guidance
- Ask about responsive design testing
Example Usage
You: "I need to test my login form across different browsers and take screenshots"
Claude: [Activates playwright-visual-testing skill]
I'll help you set up comprehensive login form testing using Playwright. Here's the workflow:
1. First, let's navigate to your login page and capture the initial state
2. We'll test the form with valid and invalid inputs
3. Capture screenshots of error states and success states
4. Test across different viewport sizes
5. Verify form accessibility with snapshots
Let me walk you through each step...
[Uses Playwright MCP tools with skill knowledge]You: "How can I detect visual regressions in my homepage after updates?"
Claude: [Activates playwright-visual-testing skill]
For visual regression testing, I recommend this workflow:
1. Capture baseline screenshots before changes
2. Make your updates and deploy
3. Capture new screenshots with identical parameters
4. Compare screenshots to identify differences
5. Review and validate changes
Here's the detailed process...
[Uses visual regression patterns from skill]Quick Start
For Visual Regression Testing
See Pattern 1 in SKILL.md for complete visual regression workflow
For Responsive Testing
See Pattern 2 in SKILL.md for multi-viewport testing strategy
For Form Testing
See Pattern 3 in SKILL.md for comprehensive form validation
For E2E Testing
See Pattern 6 in SKILL.md for complete user journey testing
Example Directory
The examples/ directory contains three comprehensive guides:
1. e-commerce-testing.md: Real-world e-commerce site testing with product browsing, cart, and checkout 2. responsive-testing.md: Complete responsive design validation across devices 3. component-library.md: Design system component testing and documentation
Each example includes:
- Step-by-step Playwright MCP tool usage
- Real-world scenarios
- Screenshot strategies
- Debugging techniques
- Best practices in action
Skill Capabilities
With this skill, Claude can:
Browser Automation
- Navigate to URLs and handle redirects
- Interact with forms and buttons
- Type text and simulate keyboard input
- Handle file uploads and downloads
- Manage multiple browser tabs
- Respond to browser dialogs
Visual Testing
- Capture full-page screenshots
- Take viewport-specific screenshots
- Screenshot individual elements
- Organize screenshots systematically
- Compare visual states
- Document visual changes
Quality Assurance
- Test form validation
- Verify user workflows
- Check responsive layouts
- Validate accessibility
- Debug JavaScript errors
- Monitor network requests
Cross-Browser Testing
- Test on Chromium/Chrome/Edge
- Test on Firefox
- Test on WebKit/Safari
- Compare browser rendering
- Identify browser-specific bugs
Debugging
- Capture console messages
- Monitor network activity
- Inspect page structure
- Verify element states
- Track user interactions
- Document issues with screenshots
Advanced Usage
Custom Test Suites
Adapt the patterns in SKILL.md to create custom test suites:
- Define your test scenarios
- Create reusable test templates
- Organize screenshots systematically
- Build comparison workflows
- Generate test reports
CI/CD Integration
Use Playwright automation in continuous integration:
- Run tests on every commit
- Capture screenshots on failures
- Compare against baselines
- Block deployments on regressions
- Generate visual test reports
Component Documentation
Generate living documentation:
- Capture all component states
- Screenshot each variant
- Organize by component type
- Include usage examples
- Update automatically
Common Workflows
1. Pre-Deployment Testing
1. Navigate to staging environment
2. Test critical user paths
3. Capture screenshots of key pages
4. Verify responsive layouts
5. Check console for errors
6. Validate network requests
7. Document any issues2. Visual Regression Suite
1. Maintain baseline screenshot library
2. Run tests after each deployment
3. Compare new vs baseline screenshots
4. Review differences
5. Update baselines for intentional changes
6. Fix unintended regressions3. Cross-Browser Validation
1. Define browser matrix
2. Run identical tests per browser
3. Capture browser-specific screenshots
4. Compare rendering across browsers
5. Document browser-specific issues
6. Apply necessary fixesViewport Reference
Mobile Devices
- iPhone SE: 375 x 667
- iPhone 12/13/14: 390 x 844
- Android Small: 360 x 640
- Android Large: 412 x 915
Tablets
- iPad Portrait: 768 x 1024
- iPad Landscape: 1024 x 768
- Android Tablet: 810 x 1080
Desktop
- HD: 1280 x 720
- Laptop: 1366 x 768
- Full HD: 1920 x 1080
- 2K: 2560 x 1440
Troubleshooting
Screenshot Issues
- Blank screenshots: Wait for page load
- Inconsistent screenshots: Disable animations
- Wrong viewport: Set explicit dimensions
- Missing elements: Wait for dynamic content
Interaction Issues
- Element not found: Take fresh snapshot
- Click not working: Verify element is actionable
- Form not submitting: Check validation errors
- Text not typing: Ensure field is focused
Browser Issues
- Browser not launching: Run browser_install
- Timeout errors: Increase wait times
- Memory issues: Close unused tabs
- Performance problems: Test smaller viewports
Resources
Playwright Documentation
MCP Integration
Testing Resources
Skill Metadata
- Version: 1.0.0
- Category: Browser Automation, Visual Testing, Quality Assurance
- Compatible With: Playwright MCP Server, Chromium, Firefox, WebKit
- Last Updated: October 2025
- Research Sources: Playwright documentation, MCP server API, real-world testing patterns
Contributing
This skill is based on:
- Comprehensive Playwright MCP server exploration
- Official Playwright documentation
- Visual testing best practices
- Real-world QA workflows
- Cross-browser testing strategies
Suggestions for improvements are welcome!
License
This skill is provided as-is for use with Claude Code and Claude API.
---
Test smarter. Ship confidently. Automate visual validation with Playwright + Claude.
Related skills
FAQ
What does playwright-visual-testing validate?
playwright-visual-testing validates component rendering in all states, visual consistency across variants, accessibility and keyboard navigation, responsive behavior, and documentation accuracy using the Playwright MCP server.
Which components does the Playwright example cover?
playwright-visual-testing examples include Button variants—Primary, Secondary, Danger, and Ghost—and Input types for Text, Email, Password, and Error states tested against a Storybook-hosted React library.
Is Playwright Visual Testing safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.