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
-
Browser: The browser instance (Chromium, Firefox, WebKit)
-
Page: A single page/tab in the browser
-
Locator: Element selector using accessibility tree
-
Snapshot: Accessibility tree representation of page state
-
Screenshot: Visual capture of page or element
-
Network Request: HTTP requests made by the page
-
Console Messages: Browser console output
-
Dialog: Browser prompts, alerts, confirms
Visual Testing Workflow
-
Navigate to the target page
-
Wait for page to stabilize (animations, loading)
-
Capture accessibility snapshot for context
-
Take screenshot of page or specific elements
-
Compare against baseline (optional)
-
Validate visual appearance and functionality
-
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 link
Use 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 HD
Example:
width: 375 height: 667
Page 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:
- Viewport Screenshot (default):
filename: "homepage-viewport.png"
- Full Page Screenshot:
filename: "homepage-full.png" fullPage: true
- 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:
- Basic Click:
element: "Submit button" ref: "456"
- Right Click:
element: "Context menu trigger" ref: "789" button: "right"
- Click with Modifier:
element: "Link to open in new tab" ref: "123" modifiers: ["ControlOrMeta"]
- Double Click:
element: "Word to select" ref: "321" doubleClick: true
browser_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:
- Form Input:
element: "Email textbox" ref: "123" text: "user@example.com"
- Search with Submit:
element: "Search field" ref: "456" text: "playwright testing" submit: true
- Character-by-Character (triggers key handlers):
element: "Auto-complete input" ref: "789" text: "New York" slowly: true
browser_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, Meta
Examples:
// 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:
- Page-level Script:
function: "() => { return document.title; }"
- 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 chooser
Example:
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:
- All Messages:
onlyErrors: false
- Errors Only:
onlyErrors: true
Use 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:
- Accept Alert:
accept: true
- Dismiss Confirm:
accept: false
- 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:
- Wait for Text:
text: "Loading complete"
- Wait for Removal:
textGone: "Loading..."
- Fixed Wait:
time: 2
Best 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:
- List Tabs:
action: "list"
- New Tab:
action: "new"
- Close Tab:
action: "close" index: 1 // Optional, closes current if omitted
- Switch Tab:
action: "select" index: 0
Use 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
-
Navigate to page
- Use browser_navigate with target URL
- Wait for page to load completely
-
Capture baseline
- Take full-page screenshot
- Use browser_snapshot for context
- Document visible elements
-
Make changes (if testing changes)
- Update code, deploy
- Clear cache
-
Capture new state
- Navigate to same URL
- Take identical screenshot
- Compare manually or with tools
-
Validate differences
- Expected changes present
- No unexpected regressions
- Document findings
Pattern 2: Responsive Design Testing
Scenario: Test layout across devices
-
Define viewports
- Mobile: 375x667 (iPhone SE)
- Tablet: 768x1024 (iPad)
- Desktop: 1920x1080 (Full HD)
-
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
-
Compare layouts
- Verify responsive breakpoints
- Check element reflow
- Validate mobile navigation
- Ensure content accessibility
-
Document issues
- Screenshot any problems
- Note viewport where issue occurs
- Record expected vs actual behavior
Pattern 3: Form Testing Workflow
Scenario: Test multi-step form submission
-
Navigate to form
- browser_navigate to form URL
- browser_snapshot to get field refs
-
Fill form fields
- Use browser_fill_form for batch entry
- Or individual browser_type for each field
- Include validation triggers
-
Test validation
- Submit with invalid data
- browser_snapshot to see errors
- Screenshot error states
- Verify error messages appear
-
Complete valid submission
- Fill all required fields
- browser_click submit button
- Wait for success message
- browser_wait_for confirmation text
-
Verify results
- Check success page
- Verify data submission
- Screenshot confirmation
- Check network requests
Pattern 4: Element-Specific Visual Testing
Scenario: Test individual component changes
-
Navigate to component page
- browser_navigate to page
- browser_snapshot for structure
-
Locate component
- Find element ref from snapshot
- Verify component is visible
-
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
-
Document state changes
- Compare screenshots
- Note expected behaviors
- Report any issues
Pattern 5: Cross-Browser Testing
Scenario: Verify consistency across browsers
-
Define browser matrix
- Chromium (Chrome/Edge)
- Firefox
- WebKit (Safari)
-
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
-
Compare results
- Side-by-side screenshots
- Functionality differences
- Performance variations
- CSS rendering issues
-
Address discrepancies
- Fix critical cross-browser bugs
- Document acceptable differences
- Add browser-specific styles if needed
Pattern 6: E2E User Journey Testing
Scenario: Complete user workflow validation
-
Start journey
- browser_navigate to landing page
- browser_snapshot initial state
- Screenshot starting point
-
Authentication
- Navigate to login
- Fill credentials with browser_fill_form
- Submit form
- Wait for redirect
- Screenshot logged-in state
-
Main workflow steps For each step:
- Take snapshot before action
- Perform user action
- Wait for completion
- Take screenshot after action
- Verify expected state
-
Complete transaction
- Submit final action
- Wait for confirmation
- Screenshot success state
- Verify completion message
-
Cleanup
- Logout if needed
- Screenshot final state
- Document journey results
Pattern 7: Accessibility Snapshot Testing
Scenario: Verify semantic structure and accessibility
-
Navigate to page
- browser_navigate to URL
-
Capture accessibility snapshot
- browser_snapshot for semantic tree
- Review element roles
- Check heading hierarchy
- Verify labels and descriptions
-
Validate structure
- Proper heading levels (h1 → h2 → h3)
- Form inputs have labels
- Buttons have accessible names
- Interactive elements have roles
- ARIA attributes present
-
Test keyboard navigation
- browser_press_key "Tab"
- Snapshot after each tab
- Verify focus indicators
- Ensure logical tab order
- Test skip links
-
Test screen reader experience
- Review snapshot text content
- Verify alt text present
- Check ARIA live regions
- Validate semantic landmarks
- Ensure meaningful structure
-
Document findings
- Screenshot accessibility tree
- Note missing labels
- Report hierarchy issues
- Suggest improvements
Browser Automation Best Practices
Screenshot Best Practices
- Consistent Naming Convention
{page}-{viewport}-{state}-{timestamp}.png
Examples: homepage-desktop-default-1634567890.png login-mobile-error-1634567891.png checkout-tablet-success-1634567892.png
- Filename Organization
screenshots/ ├── baselines/ │ ├── homepage-desktop.png │ ├── homepage-mobile.png │ └── homepage-tablet.png ├── current/ │ └── homepage-desktop-20251017.png └── diffs/ └── homepage-desktop-diff-20251017.png
-
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
-
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
- Wait for Specific Elements
// Good browser_wait_for with text: "Data loaded"
// Avoid browser_wait_for with time: 5
- Wait for Animations
// Wait for loading spinner to disappear browser_wait_for with textGone: "Loading..."
- Wait for Network Idle
// Check network requests after waiting browser_network_requests to verify completion
- Dynamic Content
// Wait for specific text before screenshot browser_wait_for with text: "Results: 42 items"
Interaction Reliability
- Always Use Snapshots First
- browser_snapshot
- Find element ref in snapshot
- Use ref for interaction
- Never guess element references
- Verify Element State
// Take snapshot to verify element exists // Check element is visible and actionable // Then perform interaction
- Handle Dynamic Elements
// Wait for element to appear browser_wait_for with text: "Submit" // Then take fresh snapshot browser_snapshot // Get updated ref and interact
- Error Recovery
// If interaction fails:
- Take screenshot of current state
- Capture console messages (browser_console_messages)
- Check network requests (browser_network_requests)
- Take new snapshot to see current state
Form Testing Strategy
- 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 triggers
- Validation Testing
// Test each validation rule
- Enter invalid data
- Attempt submission
- Snapshot to see errors
- Screenshot error messages
- Correct data
- Verify error clears
- Multi-Step Forms
// Document each step
- Fill step 1
- Screenshot before submit
- Click next
- Wait for step 2
- Snapshot new state
- Repeat for each step
Network Monitoring
- Track API Calls
// After user action browser_network_requests // Verify expected endpoints called // Check status codes // Validate request/response data
- Performance Testing
// Capture network timing browser_network_requests // Analyze:
-
Request count
-
Total transfer size
-
Response times
-
Failed requests
-
Debug Failed Requests
browser_network_requests // Find failed requests // Check error messages // Screenshot current state // Console messages for errors
Development Acceleration Strategies
Strategy 1: Test Template Creation
Create reusable test patterns:
Visual Regression Test Template:
- Navigate: browser_navigate to {URL}
- Wait: browser_wait_for for {condition}
- Baseline: browser_take_screenshot "baseline-{name}.png", fullPage: true
- [Make changes]
- Capture: browser_take_screenshot "current-{name}.png", fullPage: true
- Compare: [Manual or automated comparison]
- Document: Screenshot any differences
Responsive Test Template: For viewport in [mobile, tablet, desktop]:
- Resize: browser_resize to {viewport dimensions}
- Navigate: browser_navigate to {URL}
- Wait: browser_wait_for for stability
- Snapshot: browser_snapshot
- Screenshot: browser_take_screenshot "{page}-{viewport}.png"
- Validate: Check layout integrity
Form Test Template:
- Navigate: browser_navigate to {form URL}
- Snapshot: browser_snapshot for refs
- Fill: browser_fill_form with test data
- Screenshot: "form-filled.png"
- Submit: browser_click submit button
- Wait: browser_wait_for for result
- Verify: Snapshot and screenshot result
- Check: browser_network_requests for submission
Strategy 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:
- Define test suite
- Configure each browser
- Run tests in parallel
- Collect results
- Compare across browsers
- 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.html
Strategy 4: Visual Regression Automation
Automate visual comparison workflow:
-
Capture Baselines (one-time):
- Navigate to each page
- Take reference screenshots
- Store in baselines/
-
Run Visual Tests:
- Navigate to each page
- Take current screenshots
- Store in results/
-
Compare Images:
- Pixel-by-pixel comparison
- Highlight differences
- Generate diff images
- Calculate similarity score
-
Generate Report:
- List all comparisons
- Show side-by-side views
- Highlight failures
- Include metrics
-
Review and Update:
- Review failures
- Accept intentional changes
- Update baselines
- Fix regressions
Strategy 5: Component Library Testing
Test design system components:
Component Test Suite: For each component:
- Navigate to component page
- Snapshot for structure
- Test each variant:
- Default
- Hover
- Active
- Disabled
- Error
- Screenshot each state
- Verify accessibility
- Check responsive behavior
Documentation Generation:
- Capture all component states
- Organize by component
- Generate visual catalog
- Include code examples
- 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.png
Troubleshooting
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
- Capture Current State
- browser_snapshot - See page structure
- browser_take_screenshot - See visual state
- browser_console_messages onlyErrors: true - Check errors
- browser_network_requests - See network activity
- Isolate Issue
- Simplify test to minimum reproduction
- Test in single browser
- Disable dynamic content
- Remove variable elements
- Test step-by-step
- Document Problem
- Screenshot before issue
- Screenshot at failure point
- Capture console messages
- Save network requests
- Note expected vs actual
- Include reproduction steps
Practical Examples
Example 1: Homepage Visual Regression
Test homepage hasn't visually changed:
-
Navigate browser_navigate url: "https://example.com"
-
Wait for page load browser_wait_for textGone: "Loading..."
-
Capture baseline browser_take_screenshot filename: "homepage-baseline.png" fullPage: true
-
[After code changes, repeat]
-
Capture current browser_take_screenshot filename: "homepage-current.png" fullPage: true
-
Compare images manually or with tools
-
Document differences
Example 2: Login Form Testing
Test login form functionality:
-
Navigate to login browser_navigate url: "https://example.com/login"
-
Get form structure browser_snapshot
-
Fill form browser_fill_form fields: [ { name: "Email", type: "textbox", ref: "123", value: "test@example.com" }, { name: "Password", type: "textbox", ref: "456", value: "password123" } ]
-
Screenshot filled form browser_take_screenshot filename: "login-filled.png"
-
Submit browser_click element: "Sign In button" ref: "789"
-
Wait for redirect browser_wait_for text: "Welcome back"
-
Screenshot success browser_take_screenshot filename: "login-success.png"
-
Verify network request browser_network_requests
Example 3: Responsive Design Check
Test responsive layout:
Mobile:
-
Resize to mobile browser_resize width: 375 height: 667
-
Navigate browser_navigate url: "https://example.com"
-
Wait browser_wait_for time: 2
-
Screenshot browser_take_screenshot filename: "homepage-mobile.png" fullPage: true
Tablet: 5. Resize to tablet browser_resize width: 768 height: 1024
-
Navigate browser_navigate url: "https://example.com"
-
Screenshot browser_take_screenshot filename: "homepage-tablet.png" fullPage: true
Desktop: 8. Resize to desktop browser_resize width: 1920 height: 1080
-
Navigate browser_navigate url: "https://example.com"
-
Screenshot browser_take_screenshot filename: "homepage-desktop.png" fullPage: true
Example 4: Component State Testing
Test button states:
-
Navigate to component library browser_navigate url: "https://example.com/components/button"
-
Get page structure browser_snapshot
-
Default state browser_take_screenshot filename: "button-default.png" element: "Primary button" ref: "123"
-
Hover state browser_hover element: "Primary button" ref: "123"
browser_take_screenshot filename: "button-hover.png" element: "Primary button" ref: "123"
-
Active state browser_click element: "Primary button" ref: "123"
browser_take_screenshot filename: "button-active.png" element: "Primary button" ref: "123"
-
Snapshot for verification browser_snapshot
Example 5: E2E Checkout Flow
Test complete checkout process:
-
Navigate to product browser_navigate url: "https://example.com/products/item-123"
-
Add to cart browser_snapshot
browser_click element: "Add to Cart button" ref: "456"
browser_wait_for text: "Added to cart"
-
Go to cart browser_click element: "Cart icon" ref: "789"
browser_take_screenshot filename: "cart-with-item.png"
-
Proceed to checkout browser_click element: "Checkout button" ref: "101"
-
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"} ]
-
Screenshot checkout browser_take_screenshot filename: "checkout-filled.png" fullPage: true
-
Complete order browser_click element: "Place Order button" ref: "555"
browser_wait_for text: "Order confirmed"
-
Screenshot confirmation browser_take_screenshot filename: "order-confirmed.png" fullPage: true
-
Verify network requests browser_network_requests
Example 6: Accessibility Testing
Test keyboard navigation and structure:
-
Navigate to page browser_navigate url: "https://example.com/form"
-
Capture semantic structure browser_snapshot
-
Verify heading hierarchy
- Check h1 → h2 → h3 order
- Ensure single h1
- Verify logical structure
-
Test keyboard navigation browser_press_key key: "Tab"
browser_snapshot
browser_take_screenshot filename: "focus-field-1.png"
-
Continue tabbing browser_press_key key: "Tab"
browser_snapshot
browser_take_screenshot filename: "focus-field-2.png"
-
Verify all interactive elements reachable
- Buttons
- Links
- Form fields
- Custom widgets
-
Check ARIA labels
- Form labels present
- Button labels descriptive
- Error messages announced
- Status updates live
-
Screenshot accessibility tree browser_take_screenshot filename: "accessibility-structure.png"
Example 7: Network Debugging
Debug failed API calls:
-
Navigate to page browser_navigate url: "https://example.com/dashboard"
-
Wait for page browser_wait_for time: 3
-
Check console errors browser_console_messages onlyErrors: true
-
Check network requests browser_network_requests
-
Find failed requests
- Status: 4xx or 5xx
- Timeout errors
- CORS issues
-
Screenshot error state browser_take_screenshot filename: "api-error-state.png"
-
Retry action browser_click element: "Refresh button" ref: "123"
-
Monitor new requests browser_network_requests
-
Document findings
- Failed endpoint
- Error message
- Request/response data
- Screenshot
Example 8: Dialog Handling
Test confirmation dialogs:
-
Navigate to page browser_navigate url: "https://example.com/settings"
-
Trigger delete action browser_snapshot
browser_click element: "Delete Account button" ref: "123"
-
Handle confirmation browser_handle_dialog accept: false # Cancel first time
-
Verify still on page browser_snapshot
-
Try again browser_click element: "Delete Account button" ref: "123"
-
Accept this time browser_handle_dialog accept: true
-
Wait for result browser_wait_for text: "Account deleted"
-
Screenshot confirmation browser_take_screenshot filename: "account-deleted.png"
Example 9: Tab Management
Test multi-tab workflow:
-
List current tabs browser_tabs action: "list"
-
Open link in new tab browser_click element: "Privacy Policy link" ref: "123" modifiers: ["ControlOrMeta"]
-
Switch to new tab browser_tabs action: "select" index: 1
-
Screenshot new tab browser_take_screenshot filename: "privacy-policy.png"
-
Switch back browser_tabs action: "select" index: 0
-
Close extra tab browser_tabs action: "close" index: 1
-
Verify single tab browser_tabs action: "list"
Example 10: Animation Testing
Test loading animations:
-
Navigate to page browser_navigate url: "https://example.com/data-heavy"
-
Screenshot loading state browser_take_screenshot filename: "loading-spinner.png"
-
Wait for loading to complete browser_wait_for textGone: "Loading..."
-
Wait for animations browser_wait_for time: 1
-
Screenshot final state browser_take_screenshot filename: "content-loaded.png" fullPage: true
-
Verify stability browser_wait_for time: 2
browser_take_screenshot filename: "stable-state.png" fullPage: true
-
Compare screenshots
- loading-spinner.png
- content-loaded.png
- stable-state.png
Quick 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_requests
Common 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.html
Resources
-
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