claw-browser-automation-skill
by @weaglewang
Complete browser automation with agent-browser CLI. Supports navigation, forms, screenshots, data extraction, and parallel sessions.
clawhub install claw-browser-automation-skillπ About This Skill
name: claw-browser-automation version: 2.0.0 description: Complete browser automation with agent-browser CLI. Supports navigation, forms, screenshots, data extraction, and parallel sessions. category: automation license: MIT
Agent-Browser Skill v2.0
Overview
Complete browser automation using agent-browser CLI with local Chrome/Chromium. Supports parallel sessions, state persistence, visual debugging, and complex workflows.
Installation & Setup
Step 1: Install agent-browser
npm install -g agent-browser
Step 2: Configure Chrome Path
macOS:
export AGENT_BROWSER_EXECUTABLE_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
Add to ~/.zshrc for persistence
echo 'export AGENT_BROWSER_EXECUTABLE_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"' >> ~/.zshrc
Linux:
export AGENT_BROWSER_EXECUTABLE_PATH="/usr/bin/google-chrome"
Or for Chromium
export AGENT_BROWSER_EXECUTABLE_PATH="/usr/bin/chromium-browser"
Windows:
$env:AGENT_BROWSER_EXECUTABLE_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe"
Step 3: Verify Installation
agent-browser --version
agent-browser open https://example.com
agent-browser snapshot -i
Core Workflow
Every browser automation follows this 4-step pattern:
# 1. Navigate to URL
agent-browser open https://example.com/form2. Get snapshot with interactive element refs
agent-browser snapshot -i
Output: @e1 [input type="email"], @e2 [input type="password"], @e3 [button] "Submit"
3. Interact using refs
agent-browser fill @e1 "user@example.com"
agent-browser fill @e2 "password123"
agent-browser click @e34. Wait and verify
agent-browser wait --load networkidle
agent-browser snapshot -i
Complete Command Reference
Navigation Commands
# Open URL
agent-browser open # Navigate to URL
agent-browser open --session # Open in named session
agent-browser open --headless # Headless modeNavigation control
agent-browser back # Go back
agent-browser forward # Go forward
agent-browser refresh # Refresh page
agent-browser close # Close browser
agent-browser close --session # Close specific session
Snapshot Commands
# Basic snapshot
agent-browser snapshot # Full page snapshot
agent-browser snapshot -i # Interactive elements only (recommended)
agent-browser snapshot -i -C # Include cursor-interactive (onclick, cursor:pointer)
agent-browser snapshot -s "#selector" # Scope to CSS selector
agent-browser snapshot --json # Output as JSON
agent-browser snapshot --depth 3 # Limit DOM depth
Interaction Commands
# Click actions
agent-browser click @e1 # Click element
agent-browser click @e1 --double # Double click
agent-browser click @e1 --right # Right click
agent-browser click @e1 --modifiers Ctrl # With modifier (Ctrl, Alt, Shift, Meta)Text input
agent-browser fill @e2 "text" # Clear then type
agent-browser type @e2 "text" # Type without clearing
agent-browser type @e2 "text" --slowly # Type slowly (for rate-limited inputs)Selection
agent-browser select @e3 "option" # Select dropdown option
agent-browser select @e3 --index 2 # Select by index
agent-browser check @e4 # Check checkbox
agent-browser uncheck @e4 # Uncheck checkbox
agent-browser radio @e5 # Select radio buttonKeyboard
agent-browser press Enter # Press key
agent-browser press Tab # Tab key
agent-browser press Escape # Escape key
agent-browser press Ctrl+A # Select all
agent-browser press Ctrl+C # Copy
agent-browser press Ctrl+V # PasteMouse actions
agent-browser hover @e1 # Hover over element
agent-browser scroll down 500 # Scroll down 500px
agent-browser scroll up 300 # Scroll up
agent-browser scroll to @e1 # Scroll to element
Wait Commands
# Wait for element
agent-browser wait @e1 # Wait for element visible
agent-browser wait @e1 --timeout 10000 # Custom timeout (ms)Wait for page state
agent-browser wait --load networkidle # Wait for network idle
agent-browser wait --load domcontentloaded # Wait for DOMContentLoaded
agent-browser wait --load load # Wait for full page loadWait for URL
agent-browser wait --url "**/dashboard" # Wait for URL pattern
agent-browser wait --url "**/login" --gone # Wait for URL to disappearWait for text
agent-browser wait --text "Welcome" # Wait for text visible
agent-browser wait --text "Error" --gone # Wait for text to disappearTime wait
agent-browser wait 2000 # Wait 2 seconds
Get Information
agent-browser get text @e1 # Get element text
agent-browser get text @e1 --json # JSON output
agent-browser get html @e1 # Get element HTML
agent-browser get attribute @e1 href # Get attribute value
agent-browser get url # Get current URL
agent-browser get title # Get page title
agent-browser get count ".product" # Count elements matching selector
Capture Commands
# Screenshots
agent-browser screenshot # Screenshot to temp dir
agent-browser screenshot --full # Full page screenshot
agent-browser screenshot --output ./img.png # Save to specific path
agent-browser screenshot --element @e1 # Screenshot specific elementPDF
agent-browser pdf output.pdf # Save page as PDF
agent-browser pdf output.pdf --landscape # Landscape orientationVideo (requires extension)
agent-browser record start # Start recording
agent-browser record stop # Stop recording
Session Management
# List sessions
agent-browser session listSave/Load state
agent-browser state save auth.json # Save session state
agent-browser state load auth.json # Load saved state
agent-browser state clear # Clear all saved statesParallel sessions
agent-browser --session site1 open https://site-a.com
agent-browser --session site2 open https://site-b.com
agent-browser --session site1 click @e1
agent-browser --session site2 click @e2
Common Patterns & Recipes
Pattern 1: Form Submission with Validation
#!/bin/bash
submit-form.sh
set -e
Navigate to form
agent-browser open https://example.com/signupWait for form and get snapshot
agent-browser wait @e1 --timeout 10000
agent-browser snapshot -iFill form fields
agent-browser fill @e1 "John Doe" # Name
agent-browser fill @e2 "john@example.com" # Email
agent-browser fill @e3 "SecurePass123!" # Password
agent-browser fill @e4 "SecurePass123!" # Confirm passwordAccept terms
agent-browser check @e5Submit
agent-browser click @e6Wait for success
agent-browser wait --text "Welcome" --timeout 15000Verify and capture
agent-browser screenshot --output ./success.png
echo "Form submitted successfully!"
Pattern 2: Authentication with State Persistence
#!/bin/bash
auth-flow.sh
STATE_FILE="auth-state.json"
Check if we have saved state
if [ -f "$STATE_FILE" ]; then
echo "Loading saved authentication state..."
agent-browser state load "$STATE_FILE"
agent-browser open https://app.example.com/dashboard
# Verify still logged in
if agent-browser wait --text "Dashboard" --timeout 5000 2>/dev/null; then
echo "β Authenticated with saved state"
exit 0
else
echo "Session expired, re-authenticating..."
fi
fiFresh login
echo "Performing fresh login..."
agent-browser open https://app.example.com/login
agent-browser snapshot -iagent-browser fill @e1 "$USERNAME"
agent-browser fill @e2 "$PASSWORD"
agent-browser click @e3
Wait for dashboard
agent-browser wait --url "**/dashboard" --timeout 15000Save state for future use
agent-browser state save "$STATE_FILE"
echo "β Login successful, state saved"
Pattern 3: Data Extraction from Tables
#!/bin/bash
extract-data.sh
agent-browser open https://example.com/products
agent-browser wait --load networkidle
agent-browser snapshot -i
Extract all product data
OUTPUT_FILE="products.json"
echo "[" > "$OUTPUT_FILE"Get product count
COUNT=$(agent-browser get count ".product-item")
echo "Found $COUNT products"Extract each product
for i in $(seq 0 $((COUNT-1))); do
REF=".product-item:nth-child($((i+1)))"
NAME=$(agent-browser get text "$REF .product-name" --json)
PRICE=$(agent-browser get text "$REF .product-price" --json)
STOCK=$(agent-browser get text "$REF .product-stock" --json)
# Add comma for all but last item
if [ $i -lt $((COUNT-1)) ]; then
echo " {\"name\": $NAME, \"price\": $PRICE, \"stock\": $Stock}," >> "$OUTPUT_FILE"
else
echo " {\"name\": $NAME, \"price\": $PRICE, \"stock\": $Stock}" >> "$OUTPUT_FILE"
fi
doneecho "]" >> "$OUTPUT_FILE"
echo "Data extracted to $OUTPUT_FILE"
Pattern 4: Multi-Page Pagination
#!/bin/bash
paginate.sh
PAGE=1
MAX_PAGES=10
while [ $PAGE -le $MAX_PAGES ]; do
echo "Processing page $PAGE..."
# Navigate to page
agent-browser open "https://example.com/items?page=$PAGE"
agent-browser wait --load networkidle
# Extract data from this page
agent-browser snapshot -i
# ... extraction logic ...
# Check for next page button
if agent-browser wait @next-page --timeout 3000 2>/dev/null; then
agent-browser click @next-page
PAGE=$((PAGE + 1))
else
echo "No more pages"
break
fi
done
Pattern 5: Visual Regression Testing
#!/bin/bash
visual-test.sh
BASELINE_DIR="./baseline"
CURRENT_DIR="./current"
DIFF_DIR="./diff"
mkdir -p "$BASELINE_DIR" "$CURRENT_DIR" "$DIFF_DIR"
Capture current state
agent-browser open https://example.com
agent-browser wait --load networkidle
agent-browser screenshot --full --output "$CURRENT_DIR/homepage.png"Compare with baseline (requires imagemagick)
if [ -f "$BASELINE_DIR/homepage.png" ]; then
compare -metric AE "$BASELINE_DIR/homepage.png" "$CURRENT_DIR/homepage.png" "$DIFF_DIR/homepage-diff.png" 2>&1 || true
echo "Visual diff saved to $DIFF_DIR/homepage-diff.png"
else
echo "No baseline found. Creating baseline..."
cp "$CURRENT_DIR/homepage.png" "$BASELINE_DIR/homepage.png"
fi
Pattern 6: API Testing via Browser DevTools
#!/bin/bash
api-test.sh
agent-browser open https://api.example.com/docs
agent-browser snapshot -i
Execute JavaScript in browser context
RESPONSE=$(agent-browser eval '
fetch("/api/v1/users", {
headers: { "Authorization": "Bearer TOKEN" }
}).then(r => r.json()).then(d => JSON.stringify(d))
')echo "API Response: $RESPONSE"
Error Handling & Troubleshooting
Common Errors and Solutions
#### Error: "No browser found"
# Solution: Set Chrome path explicitly
export AGENT_BROWSER_EXECUTABLE_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"Or use flag
agent-browser --executable-path /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome open https://example.com
#### Error: "Element not found @e1"
# Solution 1: Wait for element
agent-browser wait @e1 --timeout 10000Solution 2: Re-snapshot after page load
agent-browser wait --load networkidle
agent-browser snapshot -iSolution 3: Check selector scope
agent-browser snapshot -s "#form-container"
#### Error: "Navigation timeout"
# Solution: Increase timeout
agent-browser open https://slow-site.com --timeout 60000Or wait for specific event
agent-browser wait --load domcontentloaded
#### Error: "Session already exists"
# Solution: Close existing session
agent-browser close --session Or use different session name
agent-browser --session open
Debugging Tips
# Enable verbose logging
agent-browser open https://example.com --verboseTake screenshot at any point
agent-browser screenshot --output ./debug-$(date +%s).pngGet current URL to verify navigation
agent-browser get urlCheck console logs
agent-browser consoleEvaluate JavaScript to inspect state
agent-browser eval 'document.querySelectorAll(".product").length'
Best Practices
1. Always Wait for Elements
# β BAD - May fail if element not ready
agent-browser click @e1β
GOOD - Wait first
agent-browser wait @e1 --timeout 10000
agent-browser click @e1
2. Use Specific Selectors
# β BAD - Too generic
agent-browser snapshot -s "div"β
GOOD - Specific and stable
agent-browser snapshot -s "#login-form button[type='submit']"
3. Handle Dynamic Content
# Wait for network to settle
agent-browser wait --load networkidleOr wait for specific content
agent-browser wait --text "Loading complete"
4. Save Authentication State
# Login once, reuse many times
agent-browser state save auth.jsonLoad in subsequent runs
agent-browser state load auth.json
5. Use Sessions for Parallel Work
# Run multiple independent sessions
agent-browser --session user1 open https://app.com
agent-browser --session user2 open https://app.comEach session maintains its own state
6. Handle Rate Limiting
# Add delays between actions
agent-browser type @e1 "text" --slowly
agent-browser wait 1000 # 1 second delay
Advanced Features
Custom JavaScript Execution
# Execute arbitrary JavaScript
agent-browser eval 'document.title'
agent-browser eval 'window.innerWidth'
agent-browser eval 'document.querySelectorAll(".item").length'Complex operations
agent-browser eval '
Array.from(document.querySelectorAll(".product")).map(p => ({
name: p.querySelector(".name").textContent,
price: p.querySelector(".price").textContent
}))
'
File Upload
# Upload file to file input
agent-browser upload @file-input ./document.pdfOr with absolute path
agent-browser upload @file-input /absolute/path/to/file.txt
Dialog Handling
# Accept alert/confirm
agent-browser dialog acceptDismiss
agent-browser dialog dismissHandle prompt with text
agent-browser dialog accept --text "Default value"
Cookie Management
# Get cookies
agent-browser cookie getSet cookie
agent-browser cookie set name=value --domain example.comClear cookies
agent-browser cookie clear
Performance Optimization
1. Use Headless Mode for CI/CD
agent-browser open https://example.com --headless
2. Limit Snapshot Depth
agent-browser snapshot --depth 2 # Faster on complex pages
3. Reuse Sessions
# Keep session alive for multiple operations
agent-browser --session main open https://example.com
agent-browser --session main click @e1
agent-browser --session main click @e2
agent-browser --session main close
4. Parallel Execution
# Run multiple sessions in parallel
agent-browser --session s1 open https://site1.com &
agent-browser --session s2 open https://site2.com &
wait
Security Considerations
1. Never Hardcode Credentials
# β BAD
agent-browser fill @password "MySecret123"β
GOOD - Use environment variables
agent-browser fill @password "$PASSWORD"
2. Clear Sensitive State
# After handling sensitive data
agent-browser state clear
agent-browser cookie clear
3. Use HTTPS Only
# Always use HTTPS URLs
agent-browser open https://example.com # β
agent-browser open http://example.com # β
Dependencies
npm install -g agent-browserTesting Your Setup
Run this quick test to verify everything works:
#!/bin/bash
test-setup.sh
echo "Testing agent-browser setup..."
Test 1: Version check
echo "1. Checking version..."
agent-browser --versionTest 2: Open page
echo "2. Opening test page..."
agent-browser open https://example.comTest 3: Get title
echo "3. Getting page title..."
TITLE=$(agent-browser get title)
echo "Title: $TITLE"Test 4: Screenshot
echo "4. Taking screenshot..."
agent-browser screenshot --output ./test-screenshot.pngTest 5: Snapshot
echo "5. Getting snapshot..."
agent-browser snapshot -i | head -5echo "β All tests passed!"
License
MIT License - See LICENSE file for details.
Support
For issues and feature requests, visit the agent-browser repository.
π Tips & Best Practices
1. Always Wait for Elements
# β BAD - May fail if element not ready
agent-browser click @e1β
GOOD - Wait first
agent-browser wait @e1 --timeout 10000
agent-browser click @e1
2. Use Specific Selectors
# β BAD - Too generic
agent-browser snapshot -s "div"β
GOOD - Specific and stable
agent-browser snapshot -s "#login-form button[type='submit']"
3. Handle Dynamic Content
# Wait for network to settle
agent-browser wait --load networkidleOr wait for specific content
agent-browser wait --text "Loading complete"
4. Save Authentication State
# Login once, reuse many times
agent-browser state save auth.jsonLoad in subsequent runs
agent-browser state load auth.json
5. Use Sessions for Parallel Work
# Run multiple independent sessions
agent-browser --session user1 open https://app.com
agent-browser --session user2 open https://app.comEach session maintains its own state
6. Handle Rate Limiting
# Add delays between actions
agent-browser type @e1 "text" --slowly
agent-browser wait 1000 # 1 second delay