← Back to blog
AI Agents·October 24, 2026·7 min read

How Computer-Use Agents Actually See and Click: Screenshots, Accessibility Trees, and the Grounding Problem

The hard part of a computer-use agent isn't deciding to click "submit" — it's turning that decision into a real coordinate or element reference. Here's how pixel grounding and accessibility-tree grounding actually differ, and where each one breaks.

Ask a computer-use agent to "book the 2pm slot" on a scheduling page and the planning part is almost trivial — find the calendar, find an open 2pm block, click it, confirm. The part that actually fails in production is translating "click it" into a coordinate or a target the operating system will accept as a real mouse event. That translation step is called grounding, and it is the single biggest source of failure in GUI agents today — not reasoning, not planning, grounding.

This matters because 2026 is the year computer-use agents stopped being a demo. Anthropic ships a Computer Use tool in the Claude API and drives desktop automation through it in Claude Code's own tooling; OpenAI's Operator (now folded into ChatGPT's agent mode) and the now-discontinued Atlas browser both took a screenshot-driven approach to the same problem; Google's Project Mariner leans on Chrome's accessibility layer; and ByteDance's open-weights UI-TARS line exists specifically to train a vision-language model that's good at exactly one thing — pointing at pixels. Four different labs, four different bets on where grounding signal should come from.

Two ways to find the button

Every computer-use agent runs the same outer loop: look at the screen, decide an action, execute it, look again. What differs is what "look at the screen" actually returns to the model.

Pixel grounding: screenshot in, coordinate out

The first approach treats the screen as an image. The harness takes a screenshot, sends it to a vision-language model, and asks for an action expressed in screen coordinates:

{
  "action": "left_click",
  "coordinate": [742, 381]
}

This is how Anthropic's Computer Use tool and OpenAI's CUA (computer-using agent) model work by default, and it's the entire premise of UI-TARS: a model fine-tuned on millions of screenshot-to-click pairs so it can reliably say "the submit button's centroid is at (742, 381)" without any help from the application itself.

The appeal is universality. A pixel-grounded agent doesn't care whether it's looking at a web page, a native macOS dialog, a Windows installer, or a Figma canvas — if it renders to pixels, the model can in principle click on it. The cost is that the model has to re-derive semantic structure (this is a button, that is a text field) from raw pixels every single turn, and small, dense, or oddly-styled UI elements are exactly where that derivation breaks down.

Accessibility-tree grounding: structure in, reference out

The second approach skips vision almost entirely. Every modern OS and browser already builds an accessibility tree — the same structured representation screen readers use — that exposes each UI element's role ("button"), name ("Submit"), and bounding box. An agent that reads this tree gets a list of interactive elements with stable identifiers, and can target one directly:

{
  "action": "click",
  "ref": "ref_47"
}

Microsoft's official Playwright MCP server works this way: instead of screenshots, it hands the model a YAML-ish snapshot of the page's accessibility tree, and the model picks a ref rather than a coordinate. Google's Project Mariner leans on the same DOM/accessibility signal inside Chrome rather than treating the tab as a flat image.

The appeal here is precision and robustness to layout shifts — if the page re-renders at a different resolution, ref_47 is still the submit button, where a fixed pixel coordinate no longer is. The cost is coverage: accessibility trees are only as good as the application's own semantic markup, and a huge fraction of real-world UIs — canvas-based apps, custom-rendered design tools, poorly-labeled legacy enterprise software — expose a tree that's incomplete, wrong, or empty. An agent that only trusts the tree is blind exactly where grounding is hardest.

The loop, end to end

Whichever grounding signal is used, the control loop looks the same:

Capture screen state screenshot + a11y tree Vision-language model grounds target, picks action Action executor OS/browser event injection Grounding signal pixel coordinate or accessibility ref Confirmation gate destructive / sensitive actions pause for human approval loop until task state satisfied

Three things about this loop matter more than the diagram shows. First, it's expensive per step — each iteration is a full round-trip to a large multimodal model, typically 1–4 seconds, so a task that a human does in six clicks can take an agent 30–90 seconds once you include screenshot capture and action execution overhead. Second, state can change between the screenshot and the action landing — a page finishes loading, a tooltip appears, a dialog steals focus — and a stale coordinate clicks the wrong thing. Third, and this is the one every vendor's own documentation calls out explicitly: the screen is untrusted input. Anthropic's and OpenAI's safety guidance for their respective computer-use features both flag prompt injection as a first-class risk — a web page can render text instructing the agent to do something the user never asked for, and a model that treats on-screen text as just more pixels to read has no architectural reason to distinguish "content" from "instruction." This is exactly the same trust-boundary problem that tool-calling agents have with MCP tool output, just rendered in a browser instead of returned as JSON.

Where it actually breaks

Failure modePixel groundingAccessibility-tree grounding
Dense/small UI elements (icon toolbars, dropdowns)Frequent misclicks — targets a few pixels wideReliable if the element is properly labeled
Custom-rendered canvas apps (Figma, games, some dashboards)Works in principle; needs strong visual groundingTree is often empty — no fallback
Layout shifts between screenshot and clickCoordinate goes staleRef stays valid as long as the element persists
Legacy/poorly-labeled enterprise softwareDegrades gracefully, slowlyTree is wrong or missing; agent effectively blind
Cross-platform coverage (web, native, mobile)Broad — anything that rendersNarrow — depends on OS/app accessibility support
CAPTCHA and bot-detection surfacesVisually solvable in principle, policy-blocked in practiceSame — this is a policy decision, not a technical one

The practical answer the industry has converged on is hybrid: use the accessibility tree when it's populated and trustworthy, fall back to pixel grounding when it isn't, and let the model see both signals where possible so it can cross-check one against the other. This is effectively what browser-automation MCP servers built on Playwright do when they expose both a read_page-style accessibility snapshot and coordinate-based click actions in the same tool surface — neither signal alone is sufficient, so the harness hands the model both and lets it pick per situation.

The alternative: skip grounding entirely

It's worth being explicit about what computer-use agents are actually for, because the grounding problem only exists because the agent is operating a UI built for humans. An agent that instead calls a well-defined API or MCP tool — POST /bookings with a JSON body, or an MCP server exposing a create_booking tool — never has to find a button, because there is no button. It calls a function with typed arguments and gets a typed response back. That's a meaningfully easier problem, which is why most production agent systems try to route around GUI automation wherever a structured API exists, and reserve computer-use agents for the genuinely GUI-only tail: legacy enterprise software with no API, consumer sites that block scraping, or workflows that span tools that were never meant to be integrated. Utilix's own REST API and MCP server exist for exactly this reason — an agent calling a deterministic tool endpoint for a Luhn check or a JWT decode skips the entire grounding problem by never touching a screen at all.

The takeaway

Computer-use agents aren't bottlenecked by planning — frontier models are already good enough at deciding what to click. They're bottlenecked by grounding: turning "click submit" into an action the OS will actually execute on the right pixel or the right element, every single turn, under a time budget measured in seconds. Pixel grounding gives you universal coverage and fragile precision; accessibility-tree grounding gives you precision and narrow coverage. The agents that work reliably in production right now are the ones that use both, and the agents that don't need a screen at all — because they're calling an API or an MCP tool instead — are usually the better bet when one exists.

#computer-use-agents#ai-agents#screen-grounding#accessibility-tree#agentic-browsing#ui-automation

Related reading

Prompt Engineering
Prompt Versioning and Regression Testing: Why Prompts Need a CI Pipeline Too
Context Management
Context Engineering: What Changed When Prompt Engineering Outgrew the Prompt
MCP
MCP Resources: The Primitive Almost No Server Implements