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 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 <<'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())
PYFor 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
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
02 · Fill a form
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
This is where browser-use failed, all three times. The page said “Received!” each time, but the data was wrong.
agent-browser
- Textarea
Line one↵Line twoas typed- Dropdown
2as typed
browser-use
- Textarea
Line oneLine twowrong- Dropdown
Open this select menuwrong
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
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
04 · Switch tabs
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 t1Open a new window, read it, switch back.
- agent-browser
- 3/3 passed · 0.62 s
- browser-use
- 3/3 passed · 1.04 s
05 · Use a small app
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
Both tools passed tasks 1, 3, 4 and 5 every time.
Results
| Task | agent-browser | browser-use | Gap |
|---|---|---|---|
| Table extraction | 3/30.29 s | 3/30.68 s | 2.4× |
| Mixed form* | 3/30.23 s | 0/3– | – |
| Delayed content | 3/35.33 s | 3/36.22 s | 1.2× |
| Tab switching | 3/30.62 s | 3/31.04 s | 1.7× |
| TodoMVC | 3/30.15 s | 3/30.23 s | 1.5× |
| Total | 15/15 | 12/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.