-
-
Notifications
You must be signed in to change notification settings - Fork 4.6k
browser use getting blocked
If your browser-use agent works on your laptop and gets challenge pages on a server, the problem is usually not the agent and not the prompt. It is the browser it drives and the machine that browser runs on - and only some of that is reachable from configuration.
This page is the sorted version: what BrowserProfile actually exposes, which of
those settings are worth using, what no setting can reach, the tell that is specific
to agent-driven sessions, and the honest answer about swapping in a different
engine. All of the browser-use specifics below were re-checked against
browser_use/browser/profile.py on 2026-09-03.
BrowserProfile is browser-use's configuration surface: a template of launch and
context arguments handed to the browser session. The fields that matter for blocks:
| Field | What it does |
|---|---|
executable_path |
which browser binary to launch - documented as a Chromium-based executable |
channel |
a Chromium channel: chromium, chrome, the beta/dev/canary variants, the Edge variants |
user_data_dir |
a persistent profile directory |
proxy |
proxy settings (server, bypass, username, password) |
headless |
headless or headed |
args |
extra command-line arguments |
cdp_url |
attach to an already-running browser over CDP instead of launching one |
That is a real set of levers, and two of them are worth more than people use them for.
The field expects a Chromium-family browser - every value in the channel enum is
Chromium, Chrome or Edge, and there is no Firefox among them. Its practical use is
pointing at your installed Chrome rather than the bundled test Chromium.
Those are not the same browser:
the codec set differs, the branding differs, and a real Chrome install is a far more
common thing to be than a bundled build.
Pointing this at a profile that has genuinely been used is the single highest-value change available in the configuration, because it is the only one that addresses history rather than hardware. An agent starting from an empty profile is a browser that has never been anywhere, which is most of why a fresh browser scores badly. The traps - profile lock-in, pairing the profile with a consistent identity - are covered in what a persistent profile fixes and breaks.
One thing not to over-credit: browser-use's default launch arguments already include
automation masking (--disable-blink-features=AutomationControlled and related
flags). That hides the crudest driver marker; it is surface-level, and it does
nothing for anything in the next section.
Everything about the machine. None of the fields above changes any of these, and on a server all of them are true at once:
- No GPU, so WebGL reports a software renderer.
- A container font set that does not match the claimed platform.
- No audio device, so the audio values fall back to defaults.
- A screen with no taskbar and a default resolution.
- Codec support that describes a slim build rather than a desktop install.
- A TLS handshake decided by the network stack before any page-level setting exists.
This is why "works on my laptop, blocked in Docker" is the most common shape of the problem: the agent is identical in both places, and the machine is not. The container version of the list goes through it in order.
browser-use sessions carry one signal ordinary scraping does not: the rhythm of the think-act loop. The agent reads the page, calls a model, waits, then acts - so its pauses cluster around model latency rather than reading speed, its pointer is still during the pause, its actions land dead centre because coordinates come from page structure rather than a hand, and it wastes no actions. No stealth setting in any framework fixes this, because it is produced above the browser. The timing signal has its own page.
It also gives you the cheapest diagnostic there is: note when the block arrives. A block at the first page load points at the machine or the address - the lists above. A block that arrives after a few interactions points at behaviour or volume, and an agent's retry loop is usually the volume half.
No, and it is better to say so plainly than to hand you a workaround that does not
work. browser-use drives its browser over the Chrome DevTools Protocol - the
configuration even exposes cdp_url for attaching to a running one - and its
executable and channel handling is Chromium-only. A Firefox binary in
executable_path is not a drop-in: the driver would be speaking a protocol the
browser does not implement.
The route that does accept a different engine is MCP, where the browser is a set of
tools rather than a CDP endpoint. Microsoft's
Playwright MCP server takes
--browser=firefox (checked 2026-09-03), and
invisible-playwright-mcp
goes further: it ships a Firefox patched at the C++ level as the engine behind its
tools, so an MCP-speaking assistant - Claude Code, Claude Desktop, Cursor - drives a
browser whose fingerprint is set in its own source. Disclosure: that server and
this wiki have the same maintainer, and it is the route
AIHawk is built on.
State the trade fairly, because it is a real one: going to MCP means leaving browser-use's agent loop and using an MCP-capable agent instead. Which side of the trade matters depends on where your blocks come from - the first-load-versus- after-interactions test above tells you. If your blocks are machine-shaped, the engine matters and MCP is the door to a different engine. If they are rhythm-shaped or volume-shaped, no engine swap will save you, in browser-use or anywhere else.
browser-use exposes enough configuration to fix the two things configuration can
fix: which browser binary runs, and whether the profile has a past. Point it at a
real Chrome and a used profile and you have taken the available wins. Everything
else divides into two piles. The machine-level tells are shared with every
automation tool and are fixed by changing the machine or the engine - neither of
which is a browser-use setting, and the engine route runs through MCP, not through
executable_path. The agent-rhythm and volume tells are specific to agents and are
not fixed by any fingerprint work at all. One observation - when does the block
arrive? - tells you which pile you are in.
Why is my browser-use agent blocked on a server but not locally? Because the server has no GPU, few fonts, no audio device and a default screen, and the agent is identical in both places. The machine changed, not the code.
Can I set a custom browser in browser-use? Yes: executable_path in
BrowserProfile, and it expects a Chromium-family binary. Pointing it at your real
installed Chrome rather than the bundled Chromium is worth doing.
Can I use a stealth Firefox with browser-use? No. It drives over CDP and its browser handling is Chromium-only. The route that accepts a different engine is MCP, with a different agent on top.
Does a persistent profile help? Yes, more than most settings, because it is the only one that gives the browser a history. Read the traps first.
Why do blocks arrive after a few actions rather than immediately? That points at behaviour or volume rather than fingerprint: the agent's rhythm and its retry traffic are both visible only once it starts acting.
Does adding a proxy fix it? It changes where you come from, and that is all. If the browser is announcing a server through its GPU, fonts and screen, the address was not the problem.
-
browser_use/browser/profile.pyon the browser-use main branch, retrieved 2026-09-03: theBrowserProfilefields in the table above, the Chromium-onlychannelvalues,executable_pathdocumented as a Chromium-based executable,cdp_url, and the automation-masking default launch arguments. -
Playwright's MCP documentation,
retrieved 2026-09-03, which lists
firefoxamong the supported--browservalues - confirming the MCP route, unlike browser-use, is not Chromium-only. - The machine-level surfaces are each documented on their own engine-wiki page, linked inline above.
See also: the timing signal AI agents give off and agent retry loops and rate limits for the two agent-specific tells, why does my AI agent get blocked? for the order to check things in, and browser-use alternatives for the wider landscape.
Written while maintaining AIHawk, which runs on the patched-Firefox engine described above. This page says that engine does not fit browser-use, because it does not, and a guide claiming otherwise would waste your afternoon.
Alternatives and Comparisons
- OpenAI Operator alternatives
- Open-source Operator-style agents
- Is OpenAI Operator still available?
- OpenAI Operator vs Claude computer use
- browser-use alternatives
- Choosing an AI browser agent
- Open-source AI browser agents
- Open-source computer-use agents
- What is an AI web agent?
- AI browser agents vs traditional scraping
- Cloud browser infrastructure for AI agents, explained
- Browserbase alternatives
- Firecrawl vs an AI browser agent
- Skyvern alternatives
- Stagehand vs browser-use
- Project Mariner is gone: what replaced it
- Manus alternatives
- Gemini computer use vs Claude computer use
- AIHawk, reviewed honestly by its own wiki
- AI browser vs AI browser agent: which one do you want?
When the Agent Gets Blocked
- Why does my AI agent get blocked?
- The timing signal AI agents give off
- Agent retry loops trip rate limits, not fingerprints
- Claude computer use detected as a bot
- browser-use getting blocked: what you can and cannot change
Using the Agent
- Getting an AI agent to fill out forms
- Which model to use with AIHawk
- Browser problem or model problem?
- Running AIHawk's browser from Claude Code
- Using AIHawk without an API key
- Extracting data to a CSV with an AI agent
- Monitoring a page for changes with an AI agent
- Running AIHawk's browser from Claude Desktop
- Running AIHawk's browser from Cursor
- Using an AI agent to hunt for apartments
- Getting website data into Google Sheets with an AI agent
- Using an AI agent to download invoices from portals
- AI agents for web research
- Using an AI agent to test your own website
- Running AIHawk's browser from Cline
- Posting to social media with an AI agent
- Posting to Facebook with an AI agent
- Posting to Instagram with an AI agent
- Posting to X with an AI agent
- Automating LinkedIn posts: read this first
- Appointment bots: what they are and what an agent can legitimately do