Playwright MCP Tester
Purpose
This skill enables iterative UI testing using the Playwright MCP server. Instead of manually copying/pasting screenshots, the agent can:
- •Launch a browser and navigate to the app
- •Take screenshots programmatically
- •Interact with UI elements (click, type, etc.)
- •Verify visual state and fix issues in a loop
Setup
1. Install Playwright MCP Server
bash
# Install the official Playwright MCP server (in project) bun add -d @playwright/mcp # or globally npm install -g @playwright/mcp
2. Configure MCP Server
Create a project-level .mcp.json in the workspace root:
json
{
"servers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}
}
}
Or add to Claude Desktop settings (~/.claude/settings.json):
json
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}
}
}
3. Restart Claude/IDE
After adding the MCP config, restart to load the server.
Prerequisites
- •Playwright MCP server must be configured (see Setup above)
- •Dev server must be running (e.g.,
bun devon port 5173)
MCP Server Commands
Browser Management
code
playwright_navigate - url: string (required) - URL to navigate to playwright_screenshot - name: string (required) - Name for the screenshot - selector?: string - CSS selector to screenshot (optional, defaults to full page) - fullPage?: boolean - Capture full scrollable page playwright_click - selector: string (required) - CSS selector to click playwright_fill - selector: string (required) - CSS selector of input - value: string (required) - Value to fill playwright_select - selector: string (required) - CSS selector of select element - value: string (required) - Value to select playwright_hover - selector: string (required) - CSS selector to hover playwright_evaluate - script: string (required) - JavaScript to execute in browser context
Iterative Testing Workflow
code
┌─────────────────────────────────────────────────────────────┐ │ PLAYWRIGHT ITERATIVE TEST LOOP │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. START dev server (if not running) │ │ ↓ │ │ 2. NAVIGATE to app URL │ │ playwright_navigate → http://localhost:5173 │ │ ↓ │ │ 3. SCREENSHOT current state │ │ playwright_screenshot → "initial-state" │ │ ↓ │ │ 4. ANALYZE screenshot for issues │ │ - Check if UI renders correctly │ │ - Check for error messages │ │ - Check if data displays │ │ ↓ │ │ 5. EVALUATE results: │ │ ├── All good? → Test complete ✅ │ │ └── Issues? → Fix code, goto step 3 │ │ │ └─────────────────────────────────────────────────────────────┘
Commands
"Test UI"
Runs the iterative test loop:
- •Starts dev server if needed
- •Navigates to app
- •Takes screenshot
- •Analyzes and reports issues
"Debug UI"
Interactive debugging:
- •Navigate to specific page
- •Click elements
- •Fill forms
- •Take targeted screenshots
"Visual regression"
Compare current state to expected:
- •Take screenshot
- •Compare to baseline
- •Report differences
Example Usage
Basic UI Test
code
User: "Test UI" Agent: 1. Run: bun dev (background) 2. Wait for server ready 3. playwright_navigate → http://localhost:5173 4. playwright_screenshot → "app-loaded" 5. Analyze: "Chart area is empty, no candlesticks visible" 6. Fix: Edit CandlestickChart.svelte 7. playwright_screenshot → "after-fix-1" 8. Analyze: "Charts now display data correctly" 9. Report: ✅ UI test passed
Interactive Element Test
code
User: "Test crypto selector"
Agent:
1. playwright_navigate → http://localhost:5173
2. playwright_screenshot → "before-click"
3. playwright_click → "button:has-text('ETH')"
4. Wait 2 seconds for data load
5. playwright_screenshot → "after-eth-selected"
6. Analyze: "ETH data loaded, chart updated"
7. Report: ✅ Crypto selector works
Console Error Check
code
User: "Check for JS errors" Agent: 1. playwright_navigate → http://localhost:5173 2. playwright_evaluate → "window.__errors = []; window.onerror = (m) => __errors.push(m)" 3. Wait for app to load 4. playwright_evaluate → "return window.__errors" 5. Report errors found (if any)
Integration with Assembler
The Playwright tester integrates with the Assembler iteration loop:
code
┌─────────────────────────────────────────────────────────────┐ │ ASSEMBLER + PLAYWRIGHT INTEGRATION │ ├─────────────────────────────────────────────────────────────┤ │ │ │ FOR each Work Order: │ │ 1. IMPLEMENT code changes │ │ 2. RUN Playwright test: │ │ - Navigate to app │ │ - Screenshot │ │ - Check for errors │ │ - Verify acceptance criteria │ │ 3. EVALUATE: │ │ ├── Pass? → Next WO │ │ └── Fail? → Fix and re-test │ │ │ └─────────────────────────────────────────────────────────────┘
Selectors Reference
Common Selectors for crypto-viz
javascript
// Navigation
'nav button' // Nav buttons
'button:has-text("BTC")' // Crypto selector buttons
'button:has-text("ETH")'
// Charts
'.bg-surface' // Chart containers
'[style*="height: 400px"]' // Main chart
'[style*="height: 150px"]' // Indicator charts
// Settings
'.text-sm:has-text("Settings")' // Settings panel
'input[type="range"]' // Sliders
'input[type="checkbox"]' // Toggles
// Events
'.text-sm:has-text("Detected Events")' // Event list
Error Handling
Common Issues
| Issue | Detection | Resolution |
|---|---|---|
| Blank page | Screenshot shows empty | Check console errors |
| Chart not rendering | No canvas content | Check data loading |
| API error | Error message visible | Check network/CORS |
| Layout broken | Elements misaligned | Check CSS/Tailwind |
Timeout Handling
code
If page doesn't load in 10 seconds: 1. Check if dev server is running 2. Check port availability 3. Restart server and retry
Best Practices
- •Always screenshot before and after changes
- •Wait for data to load before taking screenshots (2-3 seconds)
- •Check console for errors using playwright_evaluate
- •Use specific selectors to target elements
- •Name screenshots descriptively (e.g., "chart-after-eth-click")
Related Skills
- •
assembler-agent/ITERATION.md— Iteration loop integration - •
validator-agent/SKILL.md— Validation report generation