agent-browser vs browser-use | Chirag Patil
← All writing

Chirag Patil · Oct 23, 2026 · 3 min read

agent-browser vs browser-use

Two browser CLIs for AI agents, five tasks, three runs each. What I found and how I tested it.

agent-browser 0.38.1 · browser-use 0.13.11

TL;DR: agent-browser passed 15/15 runs, browser-use passed 12/15. agent-browser was also faster on every task both tools finished.

I wanted to know which browser tool to give my coding agent, agent-browser or browser-use. So I made both do the same five chores.

How I tested it

Codex drove both tools, so the model wasn’t a variable. Each tool got its own Brave window on the same Chromium build. Five tasks, three runs each.

I didn’t trust either tool’s “done”. After every run, a separate read-only connection checked what was actually on the page. That caught three bugs in my own checks first, which I fixed before scoring anything.

Commands vs code

This was the biggest difference. agent-browser takes plain CLI commands, one per action. browser-use’s CLI takes a Python script on stdin. Same form task, both ways:

agent-browser · shell8 commands
agent-browser open https://www.selenium.dev/selenium/web/web-form.html
agent-browser type '[name=my-text]' 'Browser bench'
agent-browser type '[name=my-textarea]' $'Line one\nLine two'
agent-browser select '[name=my-select]' 2
agent-browser uncheck '#my-check-1'
agent-browser check '#my-check-2'
agent-browser click 'button[type=submit]'
agent-browser wait --text 'Received!'
browser-use · python on stdin19 lines
browser-use <<'PY'
def click_name(role, name):
    nodes=cdp('Accessibility.getFullAXTree')['nodes']
    node=next(n for n in nodes if n.get('role',{}).get('value')==role and n.get('name',{}).get('value')==name)
    q=cdp('DOM.getBoxModel',backendNodeId=node['backendDOMNodeId'])['model']['content']
    click_at_xy(sum(q[0::2])/4,sum(q[1::2])/4)

goto_url('https://www.selenium.dev/selenium/web/web-form.html')
assert wait_for_load()
fill_input('[name=my-text]','Browser bench')
fill_input('[name=my-textarea]','Line one\nLine two')
click_name('combobox','Dropdown (select)')
press_key('Home')
press_key('ArrowDown')
press_key('ArrowDown')
press_key('Enter')
click_name('checkbox','Checked checkbox')
click_name('checkbox','Default checkbox')
click_name('button','Submit')
assert wait_for_element('#message',timeout=10)
print(page_info())
PY
The same form task, as each tool takes it. browser-use has no helper for "click the element with this name", so my script built one from raw CDP calls in the first five lines.

For an agent, that means every browser-use step is a small program to get right. When a helper didn’t exist, my script had to build one out of raw CDP calls.

The tasks

Each clip is agent-browser doing the task.

01 · Read a table

Table extractionthe-internet.herokuapp.com
The commands
agent-browser open https://the-internet.herokuapp.com/tables
agent-browser scrollintoview '#table1'
agent-browser get text '#table1 tbody'

Read four rows from a table. The highlight is just for the recording.

agent-browser
3/3 passed · 0.29 s
browser-use
3/3 passed · 0.68 s
GIF version

02 · Fill a form

Mixed formwww.selenium.dev
The commands
agent-browser open https://www.selenium.dev/selenium/web/web-form.html
agent-browser type '[name=my-text]' 'Browser bench'
agent-browser type '[name=my-textarea]' $'Line one\nLine two'
agent-browser select '[name=my-select]' 2
agent-browser uncheck '#my-check-1'
agent-browser check '#my-check-2'
agent-browser click 'button[type=submit]'
agent-browser wait --text 'Received!'

A text box, a two-line textarea, a dropdown and two checkboxes, then submit.

agent-browser
3/3 passed · 0.23 s
browser-use
0/3 passed
GIF version

This is where browser-use failed, all three times. The page said “Received!” each time, but the data was wrong.

submitted-form.htmlexpected vs received

agent-browser

Textarea
Line one↵Line twoas typed
Dropdown
2as typed

browser-use

Textarea
Line oneLine twowrong
Dropdown
Open this select menuwrong
Both tools typed the same text. browser-use's textarea arrived without its line break, and its dropdown never left the default option.

To be fair, part of this is on me. agent-browser has a select command. My browser-use script used arrow keys on the dropdown, which is what left it on the default. The missing line break is all browser-use though.

03 · Wait for content

Delayed contentthe-internet.herokuapp.com
The commands
agent-browser open https://the-internet.herokuapp.com/dynamic_loading/2
agent-browser click '#start button'
agent-browser wait '#finish'

Click Start, wait out a five-second loading bar, read the result.

agent-browser
3/3 passed · 5.33 s
browser-use
3/3 passed · 6.22 s
GIF version

04 · Switch tabs

Tab switchingthe-internet.herokuapp.com
The commands
agent-browser open https://the-internet.herokuapp.com/windows
agent-browser click 'a[href="/windows/new"]'
agent-browser tab t2
agent-browser wait --text 'New Window'
agent-browser tab t1

Open a new window, read it, switch back.

agent-browser
3/3 passed · 0.62 s
browser-use
3/3 passed · 1.04 s
GIF version

05 · Use a small app

TodoMVCdemo.playwright.dev
The commands
agent-browser open https://demo.playwright.dev/todomvc/
agent-browser type .new-todo 'Buy milk'
agent-browser press Enter
agent-browser type .new-todo 'Read book'
agent-browser press Enter
agent-browser check '.todo-list li:first-child .toggle'
agent-browser click 'a[href="#/completed"]'

Add two to-dos, tick one off, filter to Completed.

agent-browser
3/3 passed · 0.15 s
browser-use
3/3 passed · 0.23 s
GIF version

Both tools passed tasks 1, 3, 4 and 5 every time.

Results

Scoreboard3 trials per task
Taskagent-browserbrowser-useGap
Table extraction3/30.29 s3/30.68 s2.4×
Mixed form*3/30.23 s0/3––
Delayed content3/35.33 s3/36.22 s1.2×
Tab switching3/30.62 s3/31.04 s1.7×
TodoMVC3/30.15 s3/30.23 s1.5×
Total15/1512/15

Times are the median of passing trials. Gap is how many times longer browser-use took.

* browser-use's form script picked the dropdown with arrow keys, while agent-browser used its select command. Part of that miss belongs to my script, not the tool.

Verdict

agent-browser. Plain commands instead of Python, faster per step, and no wrong form submissions. Stable tab ids and built-in recording are nice too. Every clip here came from its record command.

browser-use is fine at reading, waiting and tabs, and raw CDP access is handy if your agent already writes Python. I’d rerun the form with a proper native dropdown before calling 15/15 vs 12/15 final.