AXTree
The axtree output is a compact accessibility-tree snapshot of the page. Every
referenceable node gets a stable ref (@e1, @e2, …), indented by hierarchy,
with its ARIA role, accessible name, and key HTML attributes.
zshot --output-type axtree https://example.comExample output:
Page: Example Site - Home
URL: https://example.com
@e1 [navigation]
@e2 [link] "Home" href="/home"
@e3 [link] "Products" href="/products"
@e4 [main]
@e5 [heading] "Welcome" [level=1]
@e6 [textbox] "Email" type="email" placeholder="you@example.com"
@e7 [button] "Log In"Each line is @eN [role] "name" attr="value" [state]:
@eN— the element ref, unique within the snapshot.[role]— the ARIA role."name"— the accessible name.attr="value"— selected HTML attributes:type,name,placeholder,href,alt,title.[state]— ARIA state when present:level,checked,expanded,selected,disabled,required.
Same-origin iframe content is nested directly under its [Iframe] node.
Cross-origin iframes that block access stay leaves. Elements that are
interactable through CSS or handlers but absent from the accessibility tree
(cursor-interactive divs, contenteditable, tabindex) are surfaced with a
clickable/editable/focusable marker.
JSON
axtree_json produces the same snapshot as structured JSON — a tree of nodes
each carrying ref, role, name, value, url, state, attrs, cursor,
backendDOMNodeId, bounds, and children.
zshot --output-type axtree_json https://example.comThe text form is more compact and is the default; use JSON for programmatic consumption.
Refs and the navigator
The same @eN refs name elements for the LLM navigator: it reads the snapshot
and targets elements by ref. Refs are valid only for the snapshot that produced
them, so re-snapshot after the page changes.