browser-automation
Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.
Skill by openclaw
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/openclaw-browser-automation
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/browser-automation
What's inside
- Skill name
browser-automation- Description
- Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.
- License
- MIT
- Instructions
- 158 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Browser Automation
Use this skill when you need the `browser` tool for anything beyond a single page check.
## Operating Loop
1. Check browser state before acting:
- `openclaw browser doctor` or `action="status"` when the browser/plugin setup itself may be broken.
- `action="status"` for availability.
- `action="profiles"` if login state or profile choice matters.
- `action="tabs"` before opening a new tab if retries/timeouts may have left windows behind.
2. Prefer stable tab handles:
- Open important tabs with `label`, for example `label="meet"`.
- After `action="tabs"` or `action="open"`, store `suggestedTargetId` and pass it as `targetId` in later calls.
- `suggestedTargetId` is the label when one exists, otherwise the stable `tabId` handle like `t1`.
- Avoid relying on raw DevTools `targetId` except for immediate diagnostics; it can change under Chromium target replacement.
3. Read before you click:
- For “read the page and answer X,” use `action="text"` with optional `selector` and `maxChars` for bounded visible prose (first selector match, otherwise article/main/body). On existing-session profiles, use `snapshot` instead. Efficient snapshots omit most prose.
- For virtualized lists, scroll through each segment, capture only the relevant rows, then merge the results.
- Use `action="snapshot"` on the intended `targetId`.
- Add snapshot `query` to find lines containing all query tokens, ignoring case; matching lines keep their refs.
- Use the same `targetId` for follow-up actions so refs stay on the same tab.
- For durable Playwright refs, request `refs="aria"` when supported. If you receive `axN` refs from `snapshotFormat="aria"`, use them only after that same snapshot call; stale or unbound `axN` refs fail fast and need a fresh snapshot.
- Use `urls=true` when link text is ambiguous or a direct navigation target would avoid brittle clicks.
- Use `labels=true` on snapshot or screenshot when visual position matters. On Playwright-backed profiles, the response includes an `annotations` array (`{ref, number, role, name?, box}`) with each ref's bounding box in the captured image's coordinate space, so you can reason about position without re-snapshotting; screenshot labels can also combine with `fullPage=true` (CLI: `--full-page`) to label the whole document, or `ref` / `element` to clip to one element. `profile="user"` and other existing-session (chrome-mcp) profiles render an overlay into page screenshots but do not attach `annotations` or use the Playwright full-page/ref/element projection helper, so read positions from the labeled image itself on those profiles. The raw-CDP fallback (no Playwright) does not support labeled screenshots at all and returns a 501, so only request `labels` when Playwright is available.
4. Act narrowly:
- Prefer `action="act"` with a ref from the latest snapshot.
- `navigate` returns the loaded page's compact snapshot inline, and batch `act` results that report a cross-document navigation include fresh page state; use those refs directly instead of a follow-up snapshot call.
- After a single act that triggers navigation, and after modal changes or form submissions, snapshot again before the next action.
- Avoid blind waits. Wait for visible UI state when possible.
- Use `action="emulate"` with `device`, `colorScheme`, `timezoneId`, or `locale` when testing those settings; snapshot again afterward. Existing-session profiles do not support emulation.
5. Report real blockers:
- Debug network failures with `action="requests"`, optional URL/type `filter`, and `limit` (default 50 recent entries). `clear=true` clears the collected log after reading. Use a managed profile; existing-session profiles do not support this log.
- Debug page errors with `action="errors"` and `limit` (default 50 recent entries). `clear=true` clears the collected log after reading. Existing-session profiles do not support this log.
- If the page needs login, permission, captcha, 2FA, camera/microphone approval, or another manual step, stop and tell the user exactly what is needed.
- Do not claim the browser is not logged in just because the current page shows a permission or onboarding dialog. Inspect the visible UI first.
## Browser batch CLI
`openclaw browser batch` runs an array of nested `/act` actions in one `/act` call (the same `kind="batch"` runtime reached through the agent tool), so CLI users and scripts can combine actions like `wait`, `click`, `type`, and `evaluate` into a single replayable plan without per-action round trips. Each entry in `actions[]` is a `BrowserActRequest` — the closed union the `/act` route accepts — not arbitrary `openclaw browser` subcommands. `batch` is not supported on `profile="user"` and other existing-session (chrome-mcp) profiles; send actions individually there.
- CLI: `openclaw browser batch --actions '<json>'`, `--actions-file plan.json`, or `--actions-file -` for stdin. `--actions-file` and stdin input are capped at 1,000,000 bytes; split larger plans into multiple batch commands. `--continue` sets `stopOnError=false`; default stops on first error.
- Ref lifecycle: refs come from a `snapshot` run before the batch (snapshot is not a nested action). A nested action that changes page state — such as a `click` that triggers navigation, or an `evaluate` that mutates the DOM — can invalidate earlier refs for the rest of the batch; put state-changing actions first, or split into a follow-up batch after re-snapshotting. Navigation and re-snapshotting happen outside the batch, since `open`, `navigate`, and `snapshot` are not `/act` kinds.
- Target id: nested actions share the request's tab; an explicit nested `targetId` that resolves to a different tab is rejected with `ACT_TARGET_ID_MISMATCH`.
- Response: `{ "results": [{ "ok": true } | { "ok": false, "error": "..." }, ...] }` in order; with default `stopOnError` the array ends at the first failure. Any failed entry exits nonzero; use `--json` to preserve the full response in scripts.
## Code Mode Loop
For explicit page-blocker triage with a configured Decision model, read
[Page triage](references/page-triage.md). Browser `action="judge"` classifies a
bounded observation through the selected Decision provider and returns answers,
not page text, to the primary model. It works on text-capable Chromium and
Lightpanda profiles; it is not Lightpanda native `judge()`.
When `tools.codeMode` is enabled, the Browser tool has no normal turn — it is cataloged behind `exec`/`wait`. Call it from exec cells as an async global, using the callable name the exec quick index advertises for the Browser tool (normally `browser`; colliding names get suffixed, and a client tool can win an identical name). An exact `catalog.search("browser")` returns a handle already bound to the effective callable name, so resolve the handle in each cell and call it instead of hard-coding the literal global; an empty result means the Browser tool is not cataloged in this run.
Keep the same labeled tab through the loop, and alternate reads with actions. Each `exec` cell starts a fresh VM — bindings from a completed cell are gone in the next, and only runs left `waiting` keep their state until `wait` resumes them — so carry comparison state across cells by returning it and re-embedding the returned values in the next cell:
```javascript
// previous = the url/newElements returned by the last completed cell (a fresh
// VM runs this cell, so prior bindings do not exist here).
const previous = { url: "https://example.com/inbox", newElements: 0 };
const [browser] = await catalog.search("browser", { limit: 1 });
const details = await browser({
action: "snapshot",
snapshotFormat: "ai",
targetId: "task",
refs: "aria",
interactive: true,
});
const changed =
details?.url !== previous.url ||
(details?.newElements ?? 0) > 0 ||
details?.blockedByDialog === true;
return {
targetId: details?.targetId,
url: details?.url,
newElements: details?.newElements,
stats: details?.stats,
text: details?.text,
changed,
};
```
- Code-mode calls return the tool's structured `details` directly. Snapshot and text observations include bounded `text` with the same untrusted-content wrapper as direct tool output. Keep that wrapper when returning page data to the model. Existing identity, `stats`, and dialog fields remain available.
- To read visible prose inside code mode, request `text` with a narrow selector. It does not require the evaluate capability:
```javascript
const [browser] = await catalog.search("browser", { limit: 1 });
const read = await browser({
action: "text",
selector: "main",
maxChars: 2000,
targetId: "task",
});
return { url: read?.url, text: read?.text };
```
Use snapshot `query` and text `selector`/`maxChars` to narrow reads at the Browser owner before wrapping. A blocked dialog still needs its reported recovery step; page text does not grant permission to evaluate scripts.
- Return only the fields the next step needs; never return the whole details object.
- Completed cells share no state: re-embed the previous cell's returned `url`/`newElements` in the next cell, or keep the comparison inside one cell. Only `waiting` runs persist, resumed by `wait`.
- Interleave each act with a URL or tabs check before the next dependent act.
- If a batch returns `aborted`, take a fresh snapshot before continuing.
- If `newElements` is positive, inspect those elements first, then update the re-embedded state.
- Use separate act calls when navigation is expected between steps.
## Tab Hygiene
Before creating a tab for a named task, list tabs and reuse an existing matching label or URL when it is still usable.
Example:
```json
{ "action": "tabs" }
```
If no suitable tab exists:From openclaw/openclaw, MIT.
More from openclaw/openclaw
- 0.767score
openclaw-live-updater
openclaw
Maintain the canonical live OpenClaw main checkout, macOS LaunchAgent-managed Gateway, local macOS app, exact-head main CI, and recurring full release…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.766score
feishu-doc
openclaw
Feishu document read/write workflows.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
slack-e2e
openclaw
Test Slack with Convex-leased user OAuth or QA bots; check credentials, exercise owned messages, prove Gateway behavior, and distinguish API evidence from…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
openclaw-release-validation
openclaw
Guide human release testing on an isolated OCM copy or approved in-place gateway, collect feedback, or refresh the release campaign.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
auto-qa
openclaw
Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
plugin-sdk-impact
openclaw
Count Plugin SDK consumers across live ClawHub releases and bundled OpenClaw plugins before deprecation, removal, or behavior changes; supports public…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
discord-e2e
openclaw
Test Discord with Convex-leased QA bots: check credentials without a Gateway, exercise owned messages, or prove OpenClaw replies, files, threads, reactions…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
proof-video
openclaw
Capture and annotate PR screenshots and videos with measured arrows, outlines, alignment guides, spacing brackets, captions, zoom, and speed cues.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
claw-score
openclaw
Audit or refresh OpenClaw maturity scorecard docs from root taxonomy, maturity scores, and QA evidence artifacts without using maintainer discrawl data or…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
openclaw-pr-maintainer
openclaw
Review, triage, repair, or land OpenClaw issues and pull requests with current-source evidence and the native maintainer workflow.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
prototype-openclaw-tui
openclaw
Build throwaway, fixture-driven OpenClaw Clack or Pi TUI prototypes and compare multiple interactive variants side by side in tmux without running the full…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
solid
openclaw
Write, refactor, review, or test Solid 2 UI in OpenClaw (Control UI, plugin views, Canvas hosts), including state ownership, native custom elements, overlays…
SkillAFreshness: A★ 392.9KClaude Code +9
Signals
- Stars
- 392,925
- Forks
- 82,585
- Open issues
- 4,992
- Last commit (this folder)
- Oct 14, 2026 (14 days ago)
- Last release
- Oct 24, 2026 (4 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/openclaw/openclaw
- Website
- openclaw.ai
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from openclaw
- 0.767score
openclaw-live-updater
openclaw
Maintain the canonical live OpenClaw main checkout, macOS LaunchAgent-managed Gateway, local macOS app, exact-head main CI, and recurring full release…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.766score
feishu-doc
openclaw
Feishu document read/write workflows.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
openclaw-pr-maintainer
openclaw
Review, triage, repair, or land OpenClaw issues and pull requests with current-source evidence and the native maintainer workflow.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
auto-qa
openclaw
Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
claw-score
openclaw
Audit or refresh OpenClaw maturity scorecard docs from root taxonomy, maturity scores, and QA evidence artifacts without using maintainer discrawl data or…
SkillAFreshness: A★ 392.9KClaude Code +9 - 0.764score
discord-e2e
openclaw
Test Discord with Convex-leased QA bots: check credentials without a Gateway, exercise owned messages, or prove OpenClaw replies, files, threads, reactions…
SkillAFreshness: A★ 392.9KClaude Code +9
Cite this page
browser-automation skill. Agent Mart. https://agentmart.dev/skills/openclaw-browser-automation (last updated 2026-10-24)