browser-use vs e2e
The standard library for letting AI agents drive a real browser — click, type, fill forms and complete tasks from a natural-language goal. 100k+ stars, Python. — versus — Agentic e2e testing for web and mobile: describe a goal, an agent drives the app, locators assert the result. Verified agent steps replay with zero model calls until the UI changes.
Both put an LLM agent in front of a browser to complete a natural-language goal. browser-use is a general automation library you script yourself; e2e wraps the same loop in a test runner with assertions, a replay cache and PR reporting — and covers mobile too.
| browser-use | e2e | |
|---|---|---|
| Stars | 120k | 13k |
| Forks | 13k | 693 |
| Language | Python | TypeScript |
| License | MIT | Apache-2.0 |
| Last activity | yesterday | yesterday |
| Topics | agents, web | evals, web |
| Curated connections | 17 | 3 |
browser-use — the curator's take
When the task lives behind login walls, forms and JavaScript — 'book this', 'apply to that', 'put these in my cart' — this is the default tool: it feeds the agent a cleaned DOM, executes its clicks/typing, and recovers from the endless weirdness of real websites. Install-as-skill support means Claude Code/Cursor agents pick it up in one prompt. NOT for bulk data extraction — an LLM driving a browser is the slowest, most expensive way to scrape a thousand pages (use a crawler); and treat any agent-with-a-browser as having the keys to whatever it's logged into — sandbox accordingly.
e2e — the curator's take
Pick it when Playwright selectors keep rotting and you want one runner for web (Chromium/Firefox/WebKit) and iOS/Android, with agent steps only where intent beats selectors. The record-then-replay cache is the real feature: once a later assertion verifies an agent step, CI reruns cost no model calls until the app changes. Bring your own key, local model, Claude Code/Codex via ACP, or a decision-model executor (Jev-style) for cheap bounded actions. Skip it if you need a stable API today (pre-1.0, config still moves), if you are testing an LLM's outputs rather than an app (use an eval framework), or if your suite is already deterministic Playwright that never flakes.