PluginBench
Skill
Fail
Audit score 45

browsing-with-playwright

bilalmk/todo_correct

Browser automation via Playwright MCP—navigate, fill forms, click elements, extract data.

What is browsing-with-playwright?

Automate browser interactions using Playwright MCP server. 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.

  • Navigate to URLs and go back in browser history
  • Get accessibility snapshots and screenshots of page state
  • Click elements, type text, and fill multi-field forms
  • Select dropdown options and wait for text or time conditions
  • Execute JavaScript and run multi-step Playwright code atomically

How to install browsing-with-playwright

npx skills add https://github.com/bilalmk/todo_correct --skill browsing-with-playwright
Prerequisites
  • Playwright MCP server running on port 8808 (start with bash scripts/start-server.sh)
  • Python 3 for running mcp-client.py calls
  • --shared-browser-context flag required to maintain state across calls
Claude Code
Cursor
Windsurf
Cline

How to use browsing-with-playwright

  1. 1.Start the Playwright MCP server using bash scripts/start-server.sh
  2. 2.Navigate to a URL using browser_navigate with the target URL
  3. 3.Get a snapshot using browser_snapshot to identify element references
  4. 4.Interact with elements using their refs (click, type, fill_form, select_option)
  5. 5.Wait for conditions using browser_wait_for (text or time)
  6. 6.Take screenshots with browser_take_screenshot to verify results
  7. 7.Stop the server with bash scripts/stop-server.sh when done

Use cases

Good for
  • Submitting forms on websites and waiting for confirmation
  • Extracting data from dynamic web pages using snapshots and JavaScript
  • Automating UI testing workflows with clicks, typing, and verification
  • Web scraping with element interaction and screenshot capture
  • Testing login flows and multi-step user journeys
Who it's for
  • Web automation engineers
  • QA and testing professionals
  • Data extraction specialists
  • Web scraping developers
  • Anyone automating browser-based tasks

browsing-with-playwright FAQ

When should I use browser automation vs. curl/wget?

Use Playwright for interactive tasks: form submission, clicking elements, dynamic content, JavaScript execution. Use curl/wget for static content fetching only.

Why is --shared-browser-context flag important?

Without it, each mcp-client.py call gets a fresh browser context, losing state. With it, state persists across multiple calls in the same session.

How do I find element references to click or type?

Run browser_snapshot first—it returns an accessibility tree with element refs (e.g., 'e42'). Use those refs in click, type, and fill_form commands.

What should I do if the server becomes unresponsive?

Stop and restart: run bash scripts/stop-server.sh followed by bash scripts/start-server.sh. Verify with python3 scripts/verify.py.

When should I use browser_run_code instead of individual calls?

Use browser_run_code for complex multi-step workflows that must be atomic (all-or-nothing), avoiding state issues between separate calls.

Full instructions (SKILL.md)

Source of truth, from bilalmk/todo_correct.


name: browsing-with-playwright description: | 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).

Browser Automation

Automate browser interactions via Playwright MCP server.

Server Lifecycle

Start Server

# Using helper script (recommended)
bash scripts/start-server.sh

# Or manually
npx @playwright/mcp@latest --port 8808 --shared-browser-context &

Stop Server

# 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"

When to Stop

  • End of task: Stop when browser work is complete
  • Long sessions: Keep running if doing multiple browser tasks
  • Errors: Stop and restart if browser becomes unresponsive

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.

Quick Reference

Navigation

# 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 '{}'

Get Page State

# 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}'

Interact with Elements

Use ref from snapshot output to target elements:

# 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"]}'

Wait for Conditions

# 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}'

Execute JavaScript

python3 scripts/mcp-client.py call -u http://localhost:8808 -t browser_evaluate \
  -p '{"function": "return document.title"}'

Multi-Step Playwright Code

For complex workflows, use browser_run_code to run multiple actions in one call:

python3 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).

Workflow: Form Submission

  1. Navigate to page
  2. Get snapshot to find element refs
  3. Fill form fields using refs
  4. Click submit
  5. Wait for confirmation
  6. Screenshot result

Workflow: Data Extraction

  1. Navigate to page
  2. Get snapshot (contains text content)
  3. Use browser_evaluate for complex extraction
  4. Process results

Verification

Run: python3 scripts/verify.py

Expected: ✓ Playwright MCP server running

If Verification Fails

  1. Run diagnostic: pgrep -f "@playwright/mcp"
  2. Check: Server process running on port 8808
  3. Try: bash scripts/start-server.sh
  4. Stop and report if still failing - do not proceed with downstream steps

Tool Reference

See references/playwright-tools.md for complete tool documentation.

Troubleshooting

IssueSolution
Element not foundRun browser_snapshot first to get current refs
Click failsTry browser_hover first, then click
Form not submittingUse "submit": true with browser_type
Page not loadingIncrease wait time or use browser_wait_for
Server not respondingStop and restart: bash scripts/stop-server.sh && bash scripts/start-server.sh