Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Browser automation using Playwright MCP. Navigate websites, fill forms, click elements, take screenshots, and extract data. Use when tasks require web browsing, form submission, web scraping, UI testing, or any browser interaction. NOT when only fetching static content (use curl/wget instead).
.claude/skills/aiskillstore-browsing-with-playwright/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -19% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -5% | 0% |
Automate browser interactions via Playwright MCP server.
bash# Using helper script (recommended) bash scripts/start-server.sh # Or manually npx @playwright/mcp@latest --port 8808 --shared-browser-context &
bash# Using helper script (closes browser first) bash scripts/stop-server.sh # Or manually python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_close -p '{}' pkill -f "@playwright/mcp"
Important: The --shared-browser-context flag is required to maintain browser state across multiple mcp-client.py calls. Without it, each call gets a fresh browser context.
bash# Go to URL python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_navigate \ -p '{"url": "https://example.com"}' # Go back python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_navigate_back -p '{}'
bash# Accessibility snapshot (returns element refs for clicking/typing) python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_snapshot -p '{}' # Screenshot python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_take_screenshot \ -p '{"type": "png", "fullPage": true}'
Use ref from snapshot output to target elements:
bash# Click element python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_click \ -p '{"element": "Submit button", "ref": "e42"}' # Type text python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_type \ -p '{"element": "Search input", "ref": "e15", "text": "hello world", "submit": true}' # Fill form (multiple fields) python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_fill_form \ -p '{"fields": [{"ref": "e10", "value": "john@example.com"}, {"ref": "e12", "value": "password123"}]}' # Select dropdown python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_select_option \ -p '{"element": "Country dropdown", "ref": "e20", "values": ["US"]}'
bash# Wait for text to appear python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_wait_for \ -p '{"text": "Success"}' # Wait for time (ms) python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_wait_for \ -p '{"time": 2000}'
bashpython3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_evaluate \ -p '{"function": "return document.title"}'
For complex workflows, use browser_run_code to run multiple actions in one call:
bashpython3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_run_code \ -p '{"code": "async (page) => { await page.goto(\"https://example.com\"); await page.click(\"text=Learn more\"); return await page.title(); }"}'
Tip: Use browser_run_code for complex multi-step operations that should be atomic (all-or-nothing).
Run: python3 scripts/verify.py
Expected: ✓ Playwright MCP server running
pgrep -f "@playwright/mcp"bash scripts/start-server.shSee references/playwright-tools.md for complete tool documentation.
| Issue | Solution | |-------|----------| | Element not found | Run browser_snapshot first to get current refs | | Click fails | Try browser_hover first, then click | | Form not submitting | Use "submit": true with browser_type | | Page not loading | Increase wait time or use browser_wait_for | | Server not responding | Stop and restart: bash scripts/stop-server.sh && bash scripts/start-server.sh |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 73,351 | 206,325 | +181% | 1 | 1 | 0% | 2,050 | 1,629 | -21% | 0 | 0 | — |
case-02 | fail→fail | 40,287 | 119,156 | +196% | 1 | 1 | 0% | 2,114 | 1,556 | -26% | 0 | 0 | — |
case-03 | fail→fail | 20,912 | 61,371 | +193% | 1 | 1 | 0% | 3,130 | 1,633 | -48% | 0 | 0 | — |
case-04 | fail→pass | 20,860 | 13,760 | -34% | 1 | 1 | 0% | 1,950 | 2,709 | +39% | 0 | 0 | — |
case-05 | fail→pass | 7,004 | 9,064 | +29% | 1 | 1 | 0% | 731 | 1,969 | +169% | 0 | 0 | — |
case-06 | fail→pass | 13,046 | 2,861 | -78% | 1 | 1 | 0% | 2,072 | 1,676 | -19% | 0 | 0 | — |
case-07 | fail→fail | 26,764 | 3,262 | -88% | 1 | 1 | 0% | 1,771 | 1,800 | +2% | 0 | 0 | — |
case-08 | fail→pass | 10,529 | 8,050 | -24% | 1 | 1 | 0% | 1,939 | 1,733 | -11% | 0 | 0 | — |
case-09 | fail→pass | 16,099 | 10,764 | -33% | 1 | 1 | 0% | 1,829 | 1,737 | -5% | 0 | 0 | — |
case-10 | fail→fail | 14,072 | 17,799 | +26% | 1 | 1 | 0% | 1,525 | 1,649 | +8% | 0 | 0 | — |
case-11 | fail→pass | 12,028 | 10,428 | -13% | 1 | 1 | 0% | 796 | 1,663 | +109% | 0 | 0 | — |
case-12 | fail→fail | 17,576 | 8,690 | -51% | 1 | 1 | 0% | 2,598 | 1,621 | -38% | 0 | 0 | — |
case-13 | fail→pass | 8,956 | 9,636 | +8% | 1 | 1 | 0% | 1,411 | 1,690 | +20% | 0 | 0 | — |
case-14 | pass→pass | 25,539 | 8,376 | -67% | 1 | 1 | 0% | 1,725 | 1,891 | +10% | 0 | 0 | — |
case-15 | fail→pass | 12,507 | 10,376 | -17% | 1 | 1 | 0% | 2,034 | 1,762 | -13% | 0 | 0 | — |
case-16 | pass→pass | 13,040 | 8,864 | -32% | 1 | 1 | 0% | 1,194 | 1,730 | +45% | 0 | 0 | — |
case-17 | fail→pass | 8,891 | 4,241 | -52% | 1 | 1 | 0% | 1,209 | 1,660 | +37% | 0 | 0 | — |
case-18 | fail→pass | 20,647 | 7,542 | -63% | 1 | 1 | 0% | 2,009 | 1,629 | -19% | 0 | 0 | — |
case-19 | pass→pass | 19,933 | 5,672 | -72% | 1 | 1 | 0% | 2,229 | 2,584 | +16% | 0 | 0 | — |
case-20 | fail→pass | 14,366 | 12,809 | -11% | 1 | 1 | 0% | 2,318 | 2,812 | +21% | 0 | 0 | — |
case-21 | fail→fail | 11,689 | 1,586 | -86% | 1 | 1 | 0% | 1,048 | 1,530 | +46% | 0 | 0 | — |
case-22 | pass→pass | 13,516 | 4,313 | -68% | 1 | 1 | 0% | 854 | 2,190 | +156% | 0 | 0 | — |
case-23 | pass→pass | 30,970 | 7,374 | -76% | 1 | 1 | 0% | 1,340 | 2,441 | +82% | 0 | 0 | — |
case-24 | pass→pass | 19,603 | 8,707 | -56% | 1 | 1 | 0% | 1,551 | 2,253 | +45% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 21 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +46 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.