Playwright Tab Comparison
Open multiple browser tabs and systematically compare content, behavior, or visual appearance across pages.
Quick Start
User: "Compare the staging and production checkout pages"
Workflow:
1. Create/list tabs
2. Navigate tab 1 to staging URL
3. Navigate tab 2 to production URL
4. For each tab: capture snapshot + screenshot + extract data
5. Generate comparison report
When to Use This Skill
Explicit triggers:
- "Compare these pages"
- "Open multiple tabs and compare"
- "Test cross-browser consistency"
- "A/B test these variants"
- "Compare staging vs production"
Implicit triggers:
- User provides multiple URLs to analyze
- Testing consistency across environments
- Verifying content parity
- Evaluating page variants
Use cases:
- A/B testing different landing page designs
- Comparing staging vs production environments
- Cross-browser consistency validation
- Multi-variant feature testing
- Content parity verification
- Performance comparison
Core Workflow
Step 1: Tab Setup
List existing tabs:
browser_tabs(action="list")
Create additional tabs:
# Create new tab
browser_tabs(action="new")
# Switch to specific tab (0-indexed)
browser_tabs(action="select", index=1)
Step 2: Navigate Each Tab
Navigate each tab to its target URL:
# Tab 1: Production
browser_tabs(action="select", index=0)
browser_navigate(url="https://example.com/checkout")
# Tab 2: Staging
browser_tabs(action="select", index=1)
browser_navigate(url="https://staging.example.com/checkout")
# Tab 3: Variant A
browser_tabs(action="select", index=2)
browser_navigate(url="https://example.com/checkout?variant=a")
Step 3: Capture Data from Each Tab
For each tab, collect comparison data:
a) Capture accessibility snapshot:
browser_snapshot(filename="tab1-snapshot.md")
b) Take screenshot:
browser_take_screenshot(filename="tab1-screenshot.png", fullPage=True)
c) Extract structured data:
browser_evaluate(function="""
() => {
return {
title: document.title,
url: window.location.href,
headingCount: document.querySelectorAll('h1, h2, h3').length,
buttonCount: document.querySelectorAll('button').length,
formCount: document.querySelectorAll('form').length,
// Custom extraction logic
productPrice: document.querySelector('.price')?.textContent,
ctaText: document.querySelector('.cta-button')?.textContent
};
}
""")
d) Capture network activity (optional):
browser_network_requests()
Step 4: Structure Tab Data
Organize captured data into JSON for comparison:
[
{
"tab_index": 0,
"url": "https://example.com/checkout",
"snapshot": "tab1-snapshot.md",
"screenshot": "tab1-screenshot.png",
"data": {
"title": "Checkout - Example",
"headingCount": 5,
"productPrice": "$49.99"
},
"timestamp": "2025-12-20T10:30:00Z"
},
{
"tab_index": 1,
"url": "https://staging.example.com/checkout",
"snapshot": "tab2-snapshot.md",
"screenshot": "tab2-screenshot.png",
"data": {
"title": "Checkout - Staging",
"headingCount": 6,
"productPrice": "$49.99"
},
"timestamp": "2025-12-20T10:30:15Z"
}
]
Save to tab-data.json.
Step 5: Compare Results
Option A: Use comparison script
python scripts/compare_tabs.py tab-data.json
Outputs:
- Text summary of differences
- JSON comparison file
Option B: Manual comparison
Compare key metrics:
- Element counts (headings, buttons, forms)
- Extracted data values (prices, CTA text)
- Visual appearance (review screenshots side-by-side)
- Network patterns (request counts, API endpoints)
Step 6: Generate Report
Create HTML report with side-by-side comparison:
python scripts/generate_comparison_report.py tab-data.json comparison-report.html
Open comparison-report.html in browser to view:
- Screenshots side-by-side
- Extracted data comparison
- Element count statistics
Comparison Strategies
Choose strategy based on what you're testing:
Visual Comparison - Screenshots for design consistency Content Comparison - Snapshots for structure/content parity Behavioral Comparison - Network requests for functionality testing Performance Comparison - Network timing for optimization Data Extraction Comparison - Evaluate for structured data validation
See references/comparison-strategies.md for detailed guidance.
Example: Staging vs Production
# 1. Setup tabs
browser_tabs(action="list") # Check existing
browser_tabs(action="new") # Create second tab
# 2. Navigate tabs
browser_tabs(action="select", index=0)
browser_navigate(url="https://example.com/products")
browser_tabs(action="select", index=1)
browser_navigate(url="https://staging.example.com/products")
# 3. Collect data from both tabs
tabs_data = []
for i in [0, 1]:
browser_tabs(action="select", index=i)
# Snapshot
browser_snapshot(filename=f"tab{i}-snapshot.md")
# Screenshot
browser_take_screenshot(filename=f"tab{i}-screenshot.png", fullPage=True)
# Extract data
result = browser_evaluate(function="""
() => ({
url: window.location.href,
productCount: document.querySelectorAll('.product-card').length,
categories: Array.from(document.querySelectorAll('.category')).map(c => c.textContent)
})
""")
tabs_data.append({
"tab_index": i,
"snapshot": f"tab{i}-snapshot.md",
"screenshot": f"tab{i}-screenshot.png",
"data": result
})
# Save for comparison
import json
with open('tab-data.json', 'w') as f:
json.dump(tabs_data, f, indent=2)
# 4. Generate report
# Run: python scripts/generate_comparison_report.py tab-data.json report.html
Resources
scripts/
compare_tabs.py - Analyzes tab data and generates comparison summary
- Input:
tab-data.json(structured tab data) - Output: Text summary + JSON comparison file
- Compares element counts, identifies differences
generate_comparison_report.py - Creates HTML visual comparison report
- Input:
tab-data.json+assets/report-template.html - Output: HTML file with side-by-side screenshots and data
- Embeds screenshots as base64
references/
mcp-playwright-tools.md - Quick reference for Playwright MCP tools used in this workflow (browser_tabs, browser_navigate, browser_snapshot, browser_evaluate, browser_take_screenshot)
comparison-strategies.md - Detailed guide for choosing comparison approach (visual, content, behavioral, performance, data extraction, hybrid)
assets/
report-template.html - HTML template for comparison reports with responsive grid layout and embedded styling
Expected Outcomes
Successful comparison:
- Multiple tabs opened and navigated
- Data captured from each tab (snapshots, screenshots, extracted data)
- Differences identified and documented
- HTML report generated showing side-by-side comparison
Common differences to identify:
- Element count variations
- Content changes (text, prices, CTAs)
- Visual appearance differences
- Network request patterns
- Performance metrics
Requirements
Tools:
- Playwright MCP browser automation
- Python 3.x for scripts
- Browser with tab support
Data structure:
- tab-data.json with consistent schema
- Screenshots saved to accessible paths
- Snapshots saved as markdown files
Red Flags to Avoid
- Opening too many tabs (>5) without cleanup
- Not waiting for page load before capturing data
- Inconsistent viewport sizes across tabs (affects visual comparison)
- Not saving tab data before closing tabs
- Forgetting to switch tabs before navigation/capture
- Comparing pages in different states (e.g., logged in vs logged out)
- Not handling dynamic content (timers, ads, animations)
Notes
- Tab indices are 0-based (first tab = 0)
- Always select tab before performing actions on it
- Screenshots capture current viewport unless fullPage=True
- Snapshots provide accessibility tree (better for content analysis)
- Evaluate runs JavaScript in tab context (has access to document/window)
- Network requests captured from page load onwards
- Reports embed screenshots as base64 (no external dependencies)