--- name: core description: Core agent-browser usage guide. Read this before running any agent-browser commands. Covers the snapshot-and-ref workflow, navigating pages, interacting with elements (click, fill, type, select), extracting text and data, taking screenshots, managing tabs, handling forms and auth, waiting for content, running multiple browser sessions in parallel, and troubleshooting common failures. Use when the user asks to interact with a website, fill a form, click something, extract data, take a screenshot, log into a site, test a web app, or automate any browser task. allowed-tools: Bash(agent-browser:*), Bash(agent-browser-stealth:*), Bash(abs:*), Bash(npx agent-browser:*), Bash(npx agent-browser-stealth:*) --- # agent-browser core Fast browser automation CLI for AI agents. Chrome/Chromium via CDP, no Playwright or Puppeteer dependency. Accessibility-tree snapshots with compact `@eN` refs let agents interact with pages in ~200-400 tokens instead of parsing raw HTML. Most normal web tasks (navigate, read, click, fill, extract, screenshot) are covered here. Load a specialized skill when the task falls outside browser web pages — see [When to load another skill](#when-to-load-another-skill). > **Hit a rough edge? Please report it.** If a command surprised you — a > confusing error, a stale `@ref`, an occluded click, a flaky wait, a missing > feature, or anything that cost you extra turns — open a quick issue at > **** with the exact > command and what happened vs. what you expected. Agent-filed friction reports > are how this tool gets sharper; a 30-second issue is genuinely valuable. ## The core loop ```bash agent-browser open # 1. Open a page agent-browser snapshot -i # 2. See what's on it (interactive elements only) agent-browser click @e3 # 3. Act on refs from the snapshot agent-browser snapshot -i # 4. Re-snapshot after any page change ``` Refs (`@e1`, `@e2`, ...) are assigned fresh on every snapshot. They become **stale the moment the page changes** — after clicks that navigate, form submits, dynamic re-renders, dialog opens. Always re-snapshot before your next ref interaction. ## Before you automate: pick the cheapest tool Driving a browser is the heavy option. agent-browser earns its keep when you need a **real, logged-in browser** — not for reading text off a public page. | You need | Use | |---|---| | Discover what exists / find sources | `WebSearch` | | Specific facts from a static or public page | `WebFetch` or `curl` (no browser) | | Login state, interaction, JS-rendered or anti-bot pages | **agent-browser** (this skill) | | A page the user saved before / an internal system | `agent-browser find-url ` (their bookmarks), then open it | | The user's **own already-open, logged-in** Chrome window | the **extension connect** flow (below) | Don't hand-build deep URLs with query params — links discovered by *interacting* with the site carry the right hidden context and dodge anti-bot checks; a hand-constructed URL often doesn't. ### Driving the user's real, already-open Chrome (extension) When the task needs the user's *live* logged-in window (their real session, the window they're looking at — not a fresh browser), use the extension connect flow. One-time setup: 1. `agent-browser extension install` — registers the native-messaging host. 2. Install the **agent-browser-stealth** extension. Easiest (and restart-stable): the **Chrome Web Store**, one-click *Add to Chrome*: (Dev fallback: `chrome://extensions` → Developer mode → *Load unpacked* → `extensions/ab-connect`. Load-unpacked can be disabled on Chrome restart, so prefer the Store build for unattended setups.) Once installed, plain `agent-browser open ` auto-connects through the extension relay — `auto_connect_cdp` **prefers the live relay over a raw `--remote-debugging-port`**, so Chrome 136+'s "Allow remote debugging?" consent popup never fires. `agent-browser extension connect` is the explicit form of the same path. Zero-confirmation, zero-token. Use `--launch` instead when a fresh, isolated browser is fine. **If you DO hit the "Allow remote debugging?" dialog**, don't keep retrying (every attempt re-pops it). One of two things is true: 1. **You're on a stale build.** The relay-preference that avoids this dialog landed in **fork.30**. Run `agent-browser --version`: if it's below `0.27.0-fork.30`, upgrade and retry: ```bash curl -fsSL https://raw.githubusercontent.com/leeguooooo/agent-browser-stealth/main/install.sh | sh ``` If `which -a agent-browser` shows more than one install, an old **npm/pnpm** copy (the npm registry lags behind — Releases are the source of truth) may be shadowing the upgraded one; remove the stale copy (`npm rm -g agent-browser-stealth` / `pnpm rm -g agent-browser-stealth`) so the `install.sh` build wins. A tool that bundles its *own* pinned copy (e.g. `node .../agent-browser-stealth@0.24.x/.../agent-browser`) needs that copy upgraded too. 2. **The extension/relay isn't live.** Tell the user to install the Store extension (one click, above); after that the relay stays up and the dialog never returns. Each `--session` that connects gets its **own colored Chrome tab group** (named after the session) and drives only its own tabs — multiple agents share the one real browser without cross-talk, and the user's own tabs are never grouped. CDP drives the page without moving the user's mouse/keyboard, so it doesn't fight them for control. **Anti-detection ranking: this real logged-in Chrome (extension connect) > a headed launched browser > headless (forbidden).** A genuine human browser has no headless/automation tells at all, so prefer it for anything anti-bot-sensitive. **Silent by default.** When driving the user's real Chrome the agent works entirely in the background — new tabs open un-focused, the agent never force- fronts a tab, and focus is emulated so the page still renders and reports `visibilityState: 'visible'`. You don't need to do anything; just don't expect the user's view to follow you (use the explicit `bringToFront` only if you deliberately want to surface a tab). **Human-like input for behavioural anti-bot.** Beyond fingerprint stealth, `--humanize off|fast|human` (or `AGENT_BROWSER_HUMANIZE`) makes clicks follow a curved, decelerating path with in-element landing jitter, typing use variable cadence, and scroll/drag ease. Default `off`; a per-navigation detector auto-escalates pages guarded by Akamai/PerimeterX/DataDome to `human`. Leave it on auto; force `human` only when you already know the target scores behaviour. ## Two ways to drive a page — and when to drop to `eval` You have a **real Chrome with the user's DOM**. Two layers, mix them freely: 1. **Structured** (`snapshot` + `@ref`, `find`, typed actions) — convenient and readable; best for straightforward forms and navigation. But the a11y view is *lossy and fragile*: refs go stale on any change, hidden inputs never show up, overlays can block coordinate clicks. 2. **eval-first** (`agent-browser eval ""`) — your eyes and hands on the real DOM: read hidden inputs, reach into Shadow DOM / iframes, inspect `form.elements` and `.validity`, extract the exact shape you want, or call `el.click()` directly. **The moment the structured path fights you, drop to `eval` instead of retrying it** — it's the fast way to find *why* something failed (e.g. a hidden `point_choice=none` the UI never exposes). ```bash # "what's actually in this form / why won't it submit?" agent-browser eval "[...document.forms[0].elements].map(e=>[e.name,e.type,e.value,e.checked])" agent-browser eval "document.querySelector('[name=point_choice]')?.value" agent-browser eval "[...document.forms[0].elements].filter(e=>!e.validity.valid).map(e=>e.name+': '+e.validationMessage)" agent-browser eval "document.querySelector('#stubborn').click()" # direct DOM click, bypasses overlays ``` ## Quickstart ```bash # Install once npm i -g agent-browser && agent-browser install # Take a screenshot of a page agent-browser open https://example.com agent-browser screenshot home.png agent-browser close # Search, click a result, and capture it agent-browser open https://duckduckgo.com agent-browser snapshot -i # find the search box ref agent-browser fill @e1 "agent-browser cli" agent-browser press Enter agent-browser wait --load networkidle agent-browser snapshot -i # refs now reflect results agent-browser click @e5 # click a result agent-browser screenshot result.png ``` The browser stays running across commands so these feel like a single session. Use `agent-browser close` (or `close --all`) when you're done. ## Reading a page ```bash agent-browser snapshot # full tree (verbose) agent-browser snapshot -i # interactive elements only (preferred) agent-browser snapshot -i -u # include href urls on links agent-browser snapshot -i -c # compact (no empty structural nodes) agent-browser snapshot -i -d 3 # cap depth at 3 levels agent-browser snapshot -s "#main" # scope to a CSS selector agent-browser snapshot -i --json # machine-readable output ``` Snapshot output looks like: ``` Page: Example - Log in URL: https://example.com/login @e1 [heading] "Log in" @e2 [form] @e3 [input type="email"] placeholder="Email" @e4 [input type="password"] placeholder="Password" @e5 [button type="submit"] "Continue" @e6 [link] "Forgot password?" ``` For unstructured reading (no refs needed): ```bash agent-browser get text @e1 # visible text of an element agent-browser get html @e1 # innerHTML agent-browser get attr @e1 href # any attribute agent-browser get value @e1 # input value agent-browser get title # page title agent-browser get url # current URL agent-browser get count ".item" # count matching elements ``` ## Interacting ```bash agent-browser click @e1 # click agent-browser click @e1 --new-tab # open link in new tab instead of navigating agent-browser dblclick @e1 # double-click agent-browser hover @e1 # hover agent-browser focus @e1 # focus (useful before keyboard input) agent-browser fill @e2 "hello" # clear then type agent-browser type @e2 " world" # type without clearing agent-browser press Enter # press a key at current focus agent-browser press Control+a # key combination agent-browser check @e3 # check checkbox agent-browser uncheck @e3 # uncheck agent-browser select @e4 "option-value" # select dropdown option agent-browser select @e4 "a" "b" # select multiple agent-browser upload @e5 file1.pdf # upload file(s) agent-browser scroll down 500 # scroll page (up/down/left/right) agent-browser scrollintoview @e1 # scroll element into view agent-browser drag @e1 @e2 # drag and drop ``` ### When refs don't work or you don't want to snapshot Use semantic locators: ```bash agent-browser find role button click --name "Submit" agent-browser find text "Sign In" click agent-browser find text "Sign In" click --exact # exact match only agent-browser find label "Email" fill "user@test.com" agent-browser find placeholder "Search" type "query" agent-browser find testid "submit-btn" click agent-browser find first ".card" click agent-browser find nth 2 ".card" hover ``` Or a raw CSS selector: ```bash agent-browser click "#submit" agent-browser fill "input[name=email]" "user@test.com" agent-browser click "button.primary" ``` Escalation ladder: snapshot + `@eN` refs are quickest for straightforward pages → `find role/text/label` when you'd rather skip the snapshot → raw CSS → **`eval` the moment any of those fight you** (stale refs, hidden state, occluded clicks). Don't retry a flaky structured locator three times; drop to `eval` and act on the DOM directly. `click` auto-scrolls into view and, if the coordinate click is occluded, falls back to a DOM `.click()`. If a click *reports success but nothing happened* — classic for an autocomplete/menu `
  • ` that closes on the input's blur — retry that one with `AGENT_BROWSER_CLICK_MODE=dom agent-browser click ...`, or just `agent-browser eval "