Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Browse the web for any task — research topics, read articles, interact with web apps, fill forms, take screenshots, extract data, and test web pages. Use whenever a browser would be useful, not just when the user explicitly asks.
.claude/skills/nanocoai-agent-browser/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -23% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 30% | 0% |
bashagent-browser open <url> # Navigate to page agent-browser snapshot -i # Get interactive elements with refs agent-browser click @e1 # Click element by ref agent-browser fill @e2 "text" # Fill input by ref agent-browser close # Close browser
agent-browser open <url>agent-browser snapshot -i (returns elements with refs like @e1, @e2)bashagent-browser open <url> # Navigate to URL agent-browser back # Go back agent-browser forward # Go forward agent-browser reload # Reload page agent-browser close # Close browser
bashagent-browser snapshot # Full accessibility tree agent-browser snapshot -i # Interactive elements only (recommended) agent-browser snapshot -c # Compact output agent-browser snapshot -d 3 # Limit depth to 3 agent-browser snapshot -s "#main" # Scope to CSS selector
bashagent-browser click @e1 # Click agent-browser dblclick @e1 # Double-click agent-browser fill @e2 "text" # Clear and type agent-browser type @e2 "text" # Type without clearing agent-browser press Enter # Press key agent-browser hover @e1 # Hover agent-browser check @e1 # Check checkbox agent-browser uncheck @e1 # Uncheck checkbox agent-browser select @e1 "value" # Select dropdown option agent-browser scroll down 500 # Scroll page agent-browser upload @e1 file.pdf # Upload files
bashagent-browser get text @e1 # Get element text agent-browser get html @e1 # Get innerHTML agent-browser get value @e1 # Get input value agent-browser get attr @e1 href # Get attribute agent-browser get title # Get page title agent-browser get url # Get current URL agent-browser get count ".item" # Count matching elements
bashagent-browser screenshot # Save to temp directory agent-browser screenshot path.png # Save to specific path agent-browser screenshot --full # Full page agent-browser pdf output.pdf # Save as PDF
bashagent-browser wait @e1 # Wait for element agent-browser wait 2000 # Wait milliseconds agent-browser wait --text "Success" # Wait for text agent-browser wait --url "**/dashboard" # Wait for URL pattern agent-browser wait --load networkidle # Wait for network idle
Prefer the built-in wait subcommands above. Only fall back to eval-polling when you must wait on a custom JS condition (e.g. a spinner disappearing or a "Send" button re-enabling in a chat UI).
Never write an unbounded wait loop. A bare until … do sleep; done that polls a page condition will loop forever if the condition never becomes true (page failed to load, selector changed, network stalled). That does not just fail the command — it wedges the entire agent turn: the runner keeps the model stream open, later messages get silently swallowed, and the container can hang for hours without the host's stuck-detection firing.
Always cap the wait with BOTH a wall-clock timeout and a max-attempts counter, and always exit the loop (never leave a sleep loop as the last thing running):
bash# Bounded wait: succeeds when the condition is met, gives up after ~90s. timeout 90 bash -c ' for i in $(seq 1 30); do if agent-browser eval "document.querySelector(\".loading\") === null" 2>/dev/null | grep -q true; then echo READY; exit 0 fi sleep 3 done echo TIMEOUT; exit 1 ' # Check the exit status / output: on TIMEOUT, snapshot the page and decide — # do NOT re-enter another unbounded wait.
If the wait times out, treat it as a real failure: take a snapshot -i or screenshot to see the actual page state, report what you found, and move on. Retrying the same unbounded wait is what causes the hang.
bashagent-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 placeholder "Search" type "query"
bash# Login once 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 # Later: load saved state agent-browser state load auth.json agent-browser open https://app.example.com/dashboard
bashagent-browser cookies # Get all cookies agent-browser cookies set name value # Set cookie agent-browser cookies clear # Clear cookies agent-browser storage local # Get localStorage agent-browser storage local set k v # Set value
bashagent-browser eval "document.title" # Run JavaScript
bashagent-browser open https://example.com/form agent-browser snapshot -i # Output shows: textbox "Email" [ref=e1], textbox "Password" [ref=e2], button "Submit" [ref=e3] 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 # Check result
bashagent-browser open https://example.com/products agent-browser snapshot -i agent-browser get text @e1 # Get product title agent-browser get attr @e2 href # Get link URL agent-browser screenshot products.png
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 9,925 | 2,910 | -71% | 1 | 1 | 0% | 1,622 | 2,004 | +24% | 0 | 0 | — |
case-11 | pass→pass | 2,623 | 2,012 | -23% | 1 | 1 | 0% | 416 | 1,812 | +336% | 0 | 0 | — |
case-01 | fail→pass | 8,900 | 4,258 | -52% | 1 | 1 | 0% | 1,580 | 2,347 | +49% | 0 | 0 | — |
case-02 | pass→pass | 7,993 | 5,023 | -37% | 1 | 1 | 0% | 1,437 | 2,466 | +72% | 0 | 0 | — |
case-03 | fail→pass | 15,733 | 6,656 | -58% | 1 | 1 | 0% | 2,735 | 2,698 | -1% | 0 | 0 | — |
case-04 | fail→pass | 16,137 | 3,118 | -81% | 1 | 1 | 0% | 2,513 | 1,928 | -23% | 0 | 0 | — |
case-06 | fail→pass | 9,087 | 2,326 | -74% | 1 | 1 | 0% | 1,484 | 1,923 | +30% | 0 | 0 | — |
case-07 | pass→pass | 9,288 | 1,978 | -79% | 1 | 1 | 0% | 1,543 | 1,873 | +21% | 0 | 0 | — |
case-08 | fail→pass | 6,261 | 2,242 | -64% | 1 | 1 | 0% | 1,019 | 1,874 | +84% | 0 | 0 | — |
case-09 | fail→pass | 4,456 | 2,260 | -49% | 1 | 1 | 0% | 859 | 1,893 | +120% | 0 | 0 | — |
case-10 | fail→pass | 11,050 | 3,117 | -72% | 1 | 1 | 0% | 1,862 | 2,074 | +11% | 0 | 0 | — |
case-12 | pass→pass | 5,759 | 2,123 | -63% | 1 | 1 | 0% | 944 | 1,864 | +97% | 0 | 0 | — |
case-13 | pass→pass | 5,266 | 1,517 | -71% | 1 | 1 | 0% | 746 | 1,726 | +131% | 0 | 0 | — |
case-14 | pass→pass | 7,618 | 1,689 | -78% | 1 | 1 | 0% | 1,198 | 1,709 | +43% | 0 | 0 | — |
case-15 | pass→pass | 4,050 | 1,310 | -68% | 1 | 1 | 0% | 656 | 1,718 | +162% | 0 | 0 | — |
case-16 | pass→pass | 17,137 | 2,078 | -88% | 1 | 1 | 0% | 843 | 1,895 | +125% | 0 | 0 | — |
case-17 | pass→pass | 4,221 | 2,467 | -42% | 1 | 1 | 0% | 739 | 1,958 | +165% | 0 | 0 | — |
case-18 | fail→pass | 15,485 | 1,844 | -88% | 1 | 1 | 0% | 2,389 | 1,815 | -24% | 0 | 0 | — |
case-19 | pass→pass | 5,845 | 2,672 | -54% | 1 | 1 | 0% | 967 | 1,890 | +95% | 0 | 0 | — |
case-20 | pass→pass | 5,554 | 6,440 | +16% | 1 | 1 | 0% | 1,084 | 2,793 | +158% | 0 | 0 | — |
case-21 | pass→pass | 5,537 | 6,085 | +10% | 1 | 1 | 0% | 1,121 | 2,718 | +142% | 0 | 0 | — |
case-22 | pass→pass | 12,102 | 6,320 | -48% | 1 | 1 | 0% | 1,241 | 2,627 | +112% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +41 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.