| name | agent-browser |
| description | Automates real browser interactions: navigating websites, clicking buttons, filling forms, taking screenshots, extracting data, and testing web apps. Activate whenever the user asks to open a URL, check how a page looks, fill out a form, scrape or extract content from a live page, record a demo video, debug a front-end issue visually, or run any task that requires a real browser rather than curl/fetch. Also activate when the user says "browse", "open this site", "screenshot", "check the UI", "test in the browser", or asks to interact with a web page in any way. Prefer this over WebFetch when the page requires JavaScript rendering, login, or multi-step interaction.
|
Browser Automation with agent-browser
How it works
agent-browser controls a headless Chromium instance. The core loop is:
- Open a page.
- Snapshot the accessibility tree to discover interactive elements. Each
element gets a short ref like
@e1.
- Act on elements using their refs.
- Re-snapshot after any action that changes the DOM (navigation, form
submit, tab switch, dynamic content load).
Refs are ephemeral — they become stale after DOM changes. Always re-snapshot
before acting on a changed page.
agent-browser open https://example.com
agent-browser snapshot -i
agent-browser fill @e2 "hello"
agent-browser click @e3
agent-browser snapshot -i
Choosing locators: refs vs semantic find
Use refs (@e1) by default — they are fast, unambiguous, and come directly
from snapshot -i. Use semantic find when:
- You know the label/text but have not taken a snapshot yet.
- You need to target an element by role, label, or visible text across
page changes without re-snapshotting.
- You are writing a reusable automation sequence where refs would be fragile.
agent-browser click @e3
agent-browser find role button click --name "Submit"
agent-browser find text "Sign In" click
agent-browser find label "Email" fill "user@test.com"
agent-browser find first ".item" click
agent-browser find nth 2 "a" text
Common workflows
Fill and submit a form
agent-browser open https://example.com/form
agent-browser snapshot -i
agent-browser fill @e1 "user@example.com"
agent-browser fill @e2 "password123"
agent-browser click @e3
agent-browser wait --load networkidle
agent-browser snapshot -i
Log in once, reuse the session
agent-browser open https://app.example.com/login
agent-browser snapshot -i
agent-browser fill @e1 "username"
agent-browser fill @e2 "password"
agent-browser click @e3
agent-browser wait --url "**/dashboard"
agent-browser state save auth.json
agent-browser state load auth.json
agent-browser open https://app.example.com/dashboard
Record a polished demo video
Explore the page first (so you know which refs to use), then start recording
for a clean take. Recording creates a fresh context but preserves cookies and
storage from your session.
agent-browser open https://app.example.com
agent-browser snapshot -i
agent-browser record start ./demo.webm
agent-browser click @e1
agent-browser fill @e2 "demo input"
agent-browser click @e3
agent-browser wait --load networkidle
agent-browser record stop
agent-browser record restart ./take2.webm
Extract data from a page
agent-browser open https://example.com/products
agent-browser snapshot -i
agent-browser get text @e4
agent-browser get attr @e5 href
agent-browser get html @e6
agent-browser get count ".product-card"
agent-browser eval "JSON.stringify([...document.querySelectorAll('.price')].map(e => e.textContent))"
Take a screenshot or PDF
agent-browser screenshot
agent-browser screenshot page.png
agent-browser screenshot --full
agent-browser pdf output.pdf
When to re-snapshot
Re-snapshot (agent-browser snapshot -i) whenever:
- You clicked a link or submitted a form (page navigation).
- A button triggered dynamic content (modal, accordion, tab switch).
- You scrolled and expect lazy-loaded elements.
- An action returned an error about a stale ref.
You do not need to re-snapshot after fill, type, hover, focus, or
reading data with get — these do not change the element tree.
Error recovery
| Symptom | Likely cause | Fix |
|---|
| "ref @eN not found" | Stale refs after DOM change | Re-snapshot, use new refs |
| Click does nothing | Element obscured or not yet visible | scrollintoview @eN then click, or wait @eN first |
| Page blank after open | SPA still loading | wait --load networkidle or wait --text "expected" |
| Cannot find element | Element inside iframe | frame "#iframe-id" then snapshot |
| Dialog blocking interaction | Unhandled alert/confirm | dialog accept or dialog dismiss |
| Need to debug visually | Headless mode hides UI | open <url> --headed to watch live |
Command reference
Navigation
agent-browser open <url>
agent-browser back
agent-browser forward
agent-browser reload
agent-browser close
Snapshot
agent-browser snapshot
agent-browser snapshot -i
agent-browser snapshot -c
agent-browser snapshot -d 3
agent-browser snapshot -s "#main"
Interactions
agent-browser click @e1
agent-browser dblclick @e1
agent-browser fill @e2 "text"
agent-browser type @e2 "text"
agent-browser press Enter
agent-browser press Control+a
agent-browser keydown Shift
agent-browser keyup Shift
agent-browser hover @e1
agent-browser focus @e1
agent-browser check @e1
agent-browser uncheck @e1
agent-browser select @e1 "value"
agent-browser scroll down 500
agent-browser scrollintoview @e1
agent-browser drag @e1 @e2
agent-browser upload @e1 file.pdf
Read data
agent-browser get text @e1
agent-browser get html @e1
agent-browser get value @e1
agent-browser get attr @e1 href
agent-browser get title
agent-browser get url
agent-browser get count ".item"
agent-browser get box @e1
Check state
agent-browser is visible @e1
agent-browser is enabled @e1
agent-browser is checked @e1
Wait
agent-browser wait @e1
agent-browser wait 2000
agent-browser wait --text "Success"
agent-browser wait --url "**/dash"
agent-browser wait --load networkidle
agent-browser wait --fn "window.ready"
Mouse (low-level)
agent-browser mouse move 100 200
agent-browser mouse down left
agent-browser mouse up left
agent-browser mouse wheel 100
Browser settings
agent-browser set viewport 1920 1080
agent-browser set device "iPhone 14"
agent-browser set geo 37.77 -122.42
agent-browser set offline on
agent-browser set headers '{"X-Key":"v"}'# extra HTTP headers
agent-browser set credentials user pass
agent-browser set media dark
Cookies and storage
agent-browser cookies
agent-browser cookies set name value
agent-browser cookies clear
agent-browser storage local
agent-browser storage local key
agent-browser storage local set k v
agent-browser storage local clear
Network interception
agent-browser network route <url>
agent-browser network route <url> --abort
agent-browser network route <url> --body '{}'
agent-browser network unroute [url]
agent-browser network requests
agent-browser network requests --filter api
Tabs, frames, dialogs
agent-browser tab
agent-browser tab new [url]
agent-browser tab 2
agent-browser tab close
agent-browser window new
agent-browser frame "#iframe"
agent-browser frame main
agent-browser dialog accept [text]
agent-browser dialog dismiss
JavaScript
agent-browser eval "document.title"
Debugging
agent-browser open <url> --headed
agent-browser console
agent-browser console --clear
agent-browser errors
agent-browser errors --clear
agent-browser highlight @e1
agent-browser trace start
agent-browser trace stop trace.zip
agent-browser --cdp 9222 snapshot
Sessions (parallel browsers)
agent-browser --session test1 open site-a.com
agent-browser --session test2 open site-b.com
agent-browser session list
JSON output
Add --json to any command for machine-readable output:
agent-browser snapshot -i --json
agent-browser get text @e1 --json