Agentic Browser Automation Reliability: Why "Clicked" Isn't the Same as "Worked"
6
min read
Product
The gap nobody benchmarks: clicked vs. worked
Every agentic browser tool can click a button. That was never the hard part. The hard part — the part that determines whether an agent actually completes a task or silently fails three steps later — is knowing whether the click did anything.
This is the core problem behind agentic browser automation reliability: an agent's action succeeding at the DOM level (element found, click dispatched, no exception thrown) is not the same as the action succeeding at the application level (state changed, dependent field updated, form became submittable). Most of the failures I see in production agents aren't "couldn't find the button." They're "found the button, clicked it, and the page didn't do what the agent assumed it did."
If you're building or evaluating agentic browser infrastructure, this distinction is the one to interrogate first — because it's the one most tooling doesn't measure at all.
Why aria_snapshot() alone isn't enough
Accessibility snapshots are the default source of truth for most browser-agent stacks right now, and for good reason — they're structured, they're fast, and they map cleanly onto how a screen reader (or an LLM) would describe a page. But an aria snapshot tells you what's labeled, not what's connected.
Two concrete failure modes I run into constantly:
Slotted or shadow-DOM labels. A form field's accessible name is computed from a
<label>that lives in a different shadow root than the input itself. The aria tree resolves the name fine in isolation, but the executable selector an agent needs to actually interact with the element requires walking the shadow boundary — something aria snapshots don't expose.Cross-field dependencies. A "Submit" button is only real once a required upstream field is populated — think a variant selector on a product page gating an "Add to Cart" action, or a shared-container option set where selecting one value invalidates another. Aria gives you the current labeled state of each element independently. It doesn't give you the graph of which actions require which other actions first.
Both of these are why we built _DOM_EXTRACTORS as a supplement to aria snapshots rather than a replacement for them: aria tells you what's on the page, but you need executable, resolved selectors and an explicit requires field to know what's actually clickable right now, and what has to happen before it will be.
What "reliability" actually means for an agent
When people say a browser agent is "unreliable," they usually mean one of three distinct things, and they're worth separating:
The element wasn't found. Selector broke, page changed, timing issue. This is the most visible failure and the easiest to detect — the agent gets an error.
The element was found but the interaction silently no-oped. Click landed on the wrong z-index layer, the element was disabled but not marked as such, a redirect happened that the agent didn't account for. This fails quietly — the agent moves on believing it succeeded.
The interaction worked, but a dependency wasn't satisfied. The agent filled a field that only mattered once a prior field was set, so the "successful" fill produced no downstream effect.
Categories 2 and 3 are the ones that actually erode trust in agentic systems, because they don't throw errors — they produce confident, wrong completions. A reliability layer for browser automation has to catch these, not just the loud failures.
The reliability layer between "clicked" and "actually worked"
This is the specific gap Manifest sits in. Rather than asking an agent to reason from a raw DOM dump or a labeled-but-disconnected aria tree, Manifest returns every clickable, fillable, and submittable element on a page with:
Resolved, executable locators — not just accessible names, but selectors that actually work against the live DOM, including across shadow boundaries and slotted content.
A dependency graph via the
requiresfield — so an agent (or the orchestration layer around it) knows before acting that a given action depends on another action having already succeeded, instead of finding out after the fact.Honest state reporting — including things like redirect tracking (
requested_urlvs.redirected), so "the click happened" and "the click did what the page's own routing implies it did" aren't conflated.
The output sits between the two things that already exist in most agent stacks — a browser-access layer like Browserbase that gets you into the page, and a content-extraction layer like Firecrawl that gets you the page's content — and answers the question neither of those is built to answer: what can this page actually do right now, and in what order does it have to be done?
What this looks like in practice
A typical call returns a manifest of actionable elements rather than a raw tree:
python
For a checkout flow, that might surface a submit action whose requires field points to a select action on a shipping-method field — meaning an agent (or a human reviewing the agent's plan) can see, before doing anything, that submission isn't actually available until shipping is chosen. No trial-and-error clicking, no silent no-op, no downstream task failure three steps later that's hard to trace back to its root cause.
Frequently asked questions
What does "agentic browser automation reliability" mean? It refers to whether an autonomous agent's browser actions produce the application-level outcome they're intended to — not merely whether the action executed without throwing an error. A click can succeed technically and still fail to accomplish anything.
Why isn't an accessibility snapshot (aria_snapshot()) sufficient for reliable agent actions? Aria snapshots describe labeled elements in isolation. They don't resolve selectors across shadow DOM boundaries, and they don't express dependencies between actions — for example, that one field must be filled before another becomes meaningful. Both gaps cause agents to act on elements that look valid but aren't yet actionable.
How is Manifest different from a browser-access tool or a content-extraction tool? Browser-access tools (like Browserbase) get an agent into a page. Content-extraction tools (like Firecrawl) get an agent the page's content. Manifest answers a third question: of everything on this page, what's actually clickable, fillable, or submittable right now, and what has to happen first. It's the layer between access and content that's specifically about actionability.
What is the requires field? It's a dependency graph Manifest attaches to each action, indicating which other actions must be completed first for this action to be valid — for example, a submit button that requires a variant selection to be made beforehand.
Manifest is available on a free evaluation tier, with paid plans starting at $29/mo. REST API, Python SDK, LangChain integration, and MCP server are all available today at manifest.omfang.io.