Patchright-based browser automation with bot detection bypass. Use when Claude needs to interact with local web applications, test localhost/dev servers, tak...
Patchright-based browser automation with bot detection bypass. Use for localhost, dev servers, web app testing, screenshots, and UI interactions.
URL/Network:
Web App Testing:
Browser Interaction:
Visual Verification:
Development Workflow:
Problem: scripts/executor.py terminates process on each call -> browser session lost Solution: scripts/server.py runs background server -> session persists
bash
cd ~/.claude/skills/patchright-skill
python scripts/server.py start &
bash
# Check status
python scripts/server.py status
# Stop server
python scripts/server.py stop
# Call tool
python scripts/server.py call '{"tool": "...", "args": {...}}'
bash
cd ~/.claude/skills/patchright-skill
# Start server (if not running)
python scripts/server.py start &
sleep 2
# Navigate to page
python scripts/server.py call '{"tool": "navigate", "args": {"url": "http://localhost:3000"}}'
# Take screenshot
python scripts/server.py call '{"tool": "screenshot", "args": {"path": "screenshot.png", "full_page": true}}'
bash
# Click element
python scripts/server.py call '{"tool": "click", "args": {"selector": "button.submit"}}'
python scripts/server.py call '{"tool": "click", "args": {"selector": "#menu-btn"}}'
python scripts/server.py call '{"tool": "click", "args": {"selector": "body"}}' # Click anywhere
# Type text
python scripts/server.py call '{"tool": "type", "args": {"selector": "#email", "text": "test@test.com"}}'
python scripts/server.py call '{"tool": "type", "args": {"selector": "input[name=password]", "text": "password123"}}'
bash
# Current URL
python scripts/server.py call '{"tool": "get_url"}'
# Page title
python scripts/server.py call '{"tool": "get_title"}'
# Element text
python scripts/server.py call '{"tool": "get_text", "args": {"selector": ".error-message"}}'
bash
# Wait for element to appear
python scripts/server.py call '{"tool": "wait_for", "args": {"selector": ".loading-complete", "timeout": 10000}}'
ToolDescriptionArgslaunchStart browserheadless: bool (default: false)closeClose browser-navigateGo to URLurl: string (required)screenshotSave to filepath: string, full_page: boolclickClick elementselector: string (required)typeType textselector: string, text: stringget_textGet element textselector: stringwait_forWait for elementselector: string, timeout: intget_urlGet current URL-get_titleGet page title-
bash
cd ~/.claude/skills/patchright-skill
python scripts/server.py start &
sleep 2
# Navigate to login page
python scripts/server.py call '{"tool": "navigate", "args": {"url": "http://localhost:3000/login"}}'
python scripts/server.py call '{"tool": "screenshot", "args": {"path": "login_page.png"}}'
# Fill form
python scripts/server.py call '{"tool": "type", "args": {"selector": "#email", "text": "admin@test.com"}}'
python scripts/server.py call '{"tool": "type", "args": {"selector": "#password", "text": "admin123"}}'
python scripts/server.py call '{"tool": "screenshot", "args": {"path": "login_filled.png"}}'
# Submit
python scripts/server.py call '{"tool": "click", "args": {"selector": "button[type=submit]"}}'
sleep 2
python scripts/server.py call '{"tool": "screenshot", "args": {"path": "login_result.png"}}'
bash
# Enter app
python scripts/server.py call '{"tool": "navigate", "args": {"url": "http://localhost:3000"}}'
python scripts/server.py call '{"tool": "click", "args": {"selector": "body"}}' # Click to enter
sleep 2
python scripts/server.py call '{"tool": "screenshot", "args": {"path": "app_main.png", "full_page": true}}'
# Explore features
python scripts/server.py call '{"tool": "click", "args": {"selector": ".create-btn"}}'
python scripts/server.py call '{"tool": "screenshot", "args": {"path": "after_action.png"}}'
css
/* ID */
#submit-btn
/* Class */
.nav-menu
button.primary
/* Attribute */
input[type=email]
button[data-testid="login"]
a[href="/about"]
/* Text content */
text=Login
text=Submit
/* Combined */
form#login button[type=submit]
.sidebar .menu-item:first-child
"Server not running" error:
bash
python scripts/server.py start &
sleep 2
Browser not visible:
Session disconnected:
Element not found: