| name | vercel-agent-browser |
| description | Browser automation CLI for AI agents - fast native Rust tool for controlling Chrome with accessibility-first commands |
| triggers | ["automate a browser task","control chrome with agent-browser","take a screenshot of a webpage","fill out a form automatically","extract data from a webpage","interact with web elements","navigate and click on a website","scrape website content with browser automation"] |
Vercel Agent Browser Skill
Skill by ara.so — AI Agent Skills collection.
Overview
agent-browser is a fast native Rust CLI for browser automation designed specifically for AI agents. It provides an accessibility-first approach with semantic selectors and ref-based element targeting, making it ideal for LLM-driven web automation.
Key Features:
- Native Rust performance with npm/Homebrew distribution
- Accessibility tree snapshots with stable element refs (
@e1, @e2, etc.)
- Semantic locators (role, text, label, placeholder)
- AI chat mode for natural language control
- Batch command execution
- Network interception and HAR recording
- Chrome DevTools Protocol (CDP) streaming
Installation
Global (Recommended)
npm install -g agent-browser
agent-browser install
Project Local
npm install agent-browser
npx agent-browser install
Alternative Methods
brew install agent-browser
agent-browser install
cargo install agent-browser
agent-browser install
agent-browser install --with-deps
Upgrading
agent-browser upgrade
Core Concepts
Element References (@refs)
The most powerful feature for AI agents is the accessibility snapshot with stable refs:
agent-browser open https://example.com
agent-browser snapshot
agent-browser click @e2
agent-browser fill @e3 "search query"
agent-browser get text @e1
Traditional Selectors
Standard CSS selectors also work:
agent-browser click "#submit-button"
agent-browser fill "input[name='email']" "user@example.com"
agent-browser get text ".header h1"
Semantic Locators
Find elements by their semantic meaning:
agent-browser find role button click --name "Submit"
agent-browser find role textbox fill "user@example.com" --name "Email"
agent-browser find text "Sign In" click
agent-browser find text "Welcome" click --exact
agent-browser find label "Password" fill "secret123"
agent-browser find placeholder "Search..." type "rust cli"
agent-browser find testid "login-form" click
Common Workflows
Basic Navigation and Interaction
agent-browser open https://github.com/login
agent-browser snapshot
agent-browser fill @e5 "username"
agent-browser fill @e6 "password"
agent-browser click @e7
agent-browser find label "Username" fill "username"
agent-browser find label "Password" fill "password"
agent-browser find role button click --name "Sign in"
agent-browser wait --url "**/dashboard"
agent-browser screenshot success.png
Form Automation
agent-browser open https://forms.example.com
agent-browser fill "#name" "John Doe"
agent-browser fill "#email" "john@example.com"
agent-browser select "#country" "United States"
agent-browser check "#newsletter"
agent-browser check "#terms"
agent-browser upload "#resume" "/path/to/resume.pdf"
agent-browser find role button click --name "Submit"
agent-browser wait --text "Thank you"
Data Extraction
agent-browser open https://news.ycombinator.com
agent-browser snapshot -i
agent-browser get text ".titleline > a"
agent-browser eval "Array.from(document.querySelectorAll('.titleline > a')).map(a => a.textContent)"
agent-browser eval "JSON.stringify({
title: document.querySelector('title').textContent,
links: Array.from(document.querySelectorAll('.titleline > a')).map(a => ({
text: a.textContent,
url: a.href
}))
})"
Batch Execution
Reduce overhead by running multiple commands in one invocation:
agent-browser batch \
"open https://example.com" \
"snapshot -i" \
"click @e2" \
"wait 1000" \
"screenshot result.png"
agent-browser batch --bail \
"open https://login.example.com" \
"fill #username user@example.com" \
"fill #password ${PASSWORD}" \
"click #submit" \
"wait --url '**/dashboard'"
echo '[
["open", "https://example.com"],
["snapshot"],
["click", "@e1"],
["screenshot"]
]' | agent-browser batch --json
AI Chat Mode
Natural language browser control:
agent-browser chat "go to github.com and search for rust browser automation"
agent-browser chat
Network Interception
agent-browser network route "**/*.jpg" --abort
agent-browser network route "https://ads.example.com/*" --abort
agent-browser network route '*' --abort --resource-type script
agent-browser network route '*' --abort --resource-type image,media
agent-browser network route "https://api.example.com/user" --body '{
"status": "ok",
"data": {"id": 1, "name": "Test User"}
}'
agent-browser network requests
agent-browser network requests --filter api
agent-browser network requests --type fetch,xhr
agent-browser network requests --method POST
agent-browser network requests --status 200
agent-browser network request req_123abc
agent-browser network har start
agent-browser network har stop capture.har
Screenshot Strategies
agent-browser screenshot
agent-browser screenshot ./screenshots/page.png
agent-browser screenshot --full full-page.png
agent-browser screenshot --annotate labeled.png
agent-browser screenshot --screenshot-dir ./shots --screenshot-format jpeg --screenshot-quality 80
agent-browser eval "document.querySelector('#main').screenshot()" -b > element.png
Multi-Tab Operations
agent-browser tab
agent-browser tab new --label docs https://docs.example.com
agent-browser click "#external-link" --new-tab
agent-browser tab docs
agent-browser tab t2
agent-browser tab close docs
agent-browser tab close t2
Wait Strategies
agent-browser wait "#result"
agent-browser wait 2000
agent-browser wait --text "Success"
agent-browser wait --url "**/dashboard"
agent-browser wait --load networkidle
agent-browser wait --fn "document.readyState === 'complete'"
agent-browser wait --fn "window.dataLoaded === true"
agent-browser wait --fn "!document.body.innerText.includes('Loading...')"
agent-browser wait "#spinner" --state hidden
Keyboard and Mouse Control
agent-browser press "Control+a"
agent-browser press "Control+c"
agent-browser press "Enter"
agent-browser press "Tab"
agent-browser keyboard type "Hello World"
agent-browser keyboard inserttext "Pasted content"
agent-browser keydown "Shift"
agent-browser press "a"
agent-browser keyup "Shift"
agent-browser mouse move 100 200
agent-browser mouse down left
agent-browser mouse up left
agent-browser mouse wheel 100 0
agent-browser drag "#source" "#target"
Cookies and Storage
agent-browser cookies
agent-browser cookies set "sessionId" "abc123"
agent-browser cookies clear
agent-browser cookies set --curl curl-cookies.txt
agent-browser storage local
agent-browser storage local get "token"
agent-browser storage local set "token" "eyJ..."
agent-browser storage local clear
agent-browser storage session
agent-browser storage session set "tempData" '{"key":"value"}'
Browser Configuration
agent-browser set viewport 1920 1080
agent-browser set viewport 1920 1080 2
agent-browser set device "iPhone 14"
agent-browser set geo 37.7749 -122.4194
agent-browser set offline on
agent-browser set offline off
agent-browser set headers '{"X-Custom-Header":"value"}'
agent-browser set credentials username password
agent-browser set media dark
agent-browser set media light
Advanced JavaScript Evaluation
agent-browser eval "document.title"
agent-browser eval "
JSON.stringify({
url: window.location.href,
links: Array.from(document.querySelectorAll('a')).map(a => ({
text: a.textContent.trim(),
href: a.href
})).filter(l => l.text)
})
"
agent-browser eval "document.querySelector('canvas').toDataURL()" -b > canvas.png
echo "document.body.innerHTML" | agent-browser eval --stdin
Automation Script Example
Create a reusable automation script:
#!/bin/bash
set -e
SESSION_FILE=".browser-session"
agent-browser open https://app.example.com/login
agent-browser find label "Email" fill "${USER_EMAIL}"
agent-browser find label "Password" fill "${USER_PASSWORD}"
agent-browser find role button click --name "Sign in"
agent-browser wait --url "**/dashboard"
agent-browser wait 1000
DATA=$(agent-browser eval "
JSON.stringify({
user: document.querySelector('.user-name').textContent,
notifications: Array.from(document.querySelectorAll('.notification')).map(n => n.textContent)
})
")
echo "$DATA" | jq .
agent-browser screenshot dashboard.png
agent-browser close
Usage:
export USER_EMAIL="user@example.com"
export USER_PASSWORD="secret"
chmod +x login-and-extract.sh
./login-and-extract.sh
Batch Automation Pattern
For complex multi-step workflows, use batch mode with a script:
#!/usr/bin/env node
const commands = [
["open", "https://example.com"],
["snapshot"],
["click", "@e5"],
["wait", "1000"],
["screenshot", "step1.png"],
["find", "role", "button", "click", "--name", "Next"],
["wait", "--url", "**/step2"],
["screenshot", "step2.png"]
];
console.log(JSON.stringify(commands));
Run with:
node automation.js | agent-browser batch --json --bail
CDP Streaming for Real-Time Monitoring
Connect to Chrome DevTools Protocol for event streaming:
CDP_URL=$(agent-browser get cdp-url)
echo "CDP URL: $CDP_URL"
agent-browser connect 9222
agent-browser stream enable --port 9223
agent-browser stream status
agent-browser stream disable
Troubleshooting
Browser Not Found
agent-browser install
export CHROME_PATH=/path/to/chrome
agent-browser open
Elements Not Found
agent-browser snapshot -i
agent-browser wait "#dynamic-element"
agent-browser click "#dynamic-element"
agent-browser find role button click --name "Submit"
Session Management
agent-browser tab
agent-browser close
agent-browser close --all
Debugging
agent-browser get cdp-url
agent-browser network requests
agent-browser network har start
agent-browser network har stop debug.har
Clipboard Access Issues
On Linux, clipboard requires xclip or xsel:
sudo apt-get install xclip
sudo apt-get install xsel
Environment Variables
export CHROME_PATH=/Applications/Brave Browser.app/Contents/MacOS/Brave Browser
export CHROME_USER_DATA_DIR=~/.config/agent-browser
export CHROME_HEADLESS=true
export CHROME_HEADLESS=false
Best Practices for AI Agents
- Use snapshots first: Always get
agent-browser snapshot to understand page structure before acting
- Prefer refs over selectors: Use
@e1 style refs from snapshots for stability
- Use semantic locators:
find role button --name "Submit" is more resilient than CSS selectors
- Wait strategically: Add
wait commands for dynamic content before interacting
- Batch when possible: Use
batch mode to reduce per-command overhead
- Handle errors: Use
--bail in batch mode to stop on first error
- Clean up: Always
close sessions when done
- Screenshot for verification: Take screenshots at key steps for debugging
- Use labels for tabs: Assign meaningful labels when opening multiple tabs
Quick Reference
agent-browser open <url>
agent-browser snapshot
agent-browser click @eN
agent-browser find role button click --name "Text"
agent-browser wait --text "Success"
agent-browser screenshot result.png
agent-browser get text @eN
agent-browser eval "JS"
agent-browser batch "cmd1" "cmd2"
agent-browser close