zshot/cliDownload

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.com

Example 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.com

The 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.