Captures the rendered layout of a webpage as a spatial tree of elements, with positions, sizes, grid layouts, backgrounds, and overlay occlusion, via the web CLI. Returns indented text, a JSON tree, and a map from node IDs to CSS selectors. Use before page decomposition, overlay detection, or brand extraction, or when the user asks for a page's visual hierarchy or layout.
94%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Capture a spatial hierarchy of rendered DOM elements from any webpage with
web page tree.
Node 22+ and playwright-cli >= 0.1.20 on PATH (playwright-cli --version).
Locate the web CLI once:
# <skill-dir> is the directory containing this SKILL.md
WEB=$(command -v web || echo "node <skill-dir>/../../cli/dist/web.mjs")then run $WEB …; it prints exactly one JSON document on stdout,
so $WEB … > file.json is safe.
Fallback when published: npx -y @adobe/web-cli. Use an absolute <skill-dir>; don't cd into it.
Sessions. If WEB_SESSION or PLAYWRIGHT_CLI_SESSION is set, do not pass
--session: every web command uses that browser and leaves it open. Otherwise
either run one-shot ($WEB page tree "$URL" opens and closes its own browser) or
start a browser and reuse the generated name:
S=$($WEB browser open "$URL" | jq -r .session) then --session "$S".
Never invent a fixed session name.
Before page decomposition, overlay detection, or brand extraction, or when the user asks for a page's visual hierarchy or layout.
$WEB page tree "$URL" [--min-width 900] [--settle-ms 2000]
$WEB page tree "$URL" --format text # only the indented tree
$WEB page tree --session "$S" # reuse an open browser| Option | Default | Description |
|---|---|---|
--min-width <n> | 900 | Minimum element width in px. Narrower elements are excluded; position: fixed elements always pass. Lower for more detail (e.g. 300 for mobile). |
--settle-ms <n> | 2000 | Wait after scrolling for lazy content. |
The CLI scrolls for lazy content before capturing. Fixed elements stay fixed:
each becomes its own root node. With a <url> and no --session it opens and
closes its own browser.
{ text, tree, nodeMap, rootBackground, url, session, durationMs }
text (the primary output for LLM consumers; --format text prints only this):
r @0,0 1440x5667
rc1 [3x1] @0,0 1440x83 "Header text..."
rc2 @0,83 1440x5216
rc2c1 [bg:image] @0,83 1440x410 "Hero text..."Format: ID [role] [CxR] [bg:type] @x,y wxh "text..."
nodeMap: node ID → { selector, background?: { type, value, raw, source }, overlay?: { occluding: [sibling IDs] } }. An overlay entry means the node was
promoted to root level because it is position: fixed or rendered outside its
parent's bounds (cookie banners, fixed navs, modals, open dropdowns). Its
selector is usable for dismissal. Content clipped by an overflow: hidden
ancestor (carousels, marquees) is not promoted; content clipped to nothing is
not in the tree.
tree: the full structured tree (tag, selector, bounds, text, role, layout,
background, children; id and className with every class when present; fixed
for position: fixed; clip, when overflow-clipping ancestors cut the node's box, the
visible region as { x, width }, { y, height } or both;
collapsed, the single-child chain a node absorbed, outermost first, as
{ tag, selector, id?, className? }). Show it only if the caller asks; otherwise
mention it exists.
$WEB page overlays --session "$S" --dismiss
first, then page tree --session "$S".browser-probe skill, then re-run with
--recipe <recipePath printed by probe>.playwright-cli -s <session> … drives the same browser ($WEB browser list
shows the names).
adobe/skills
7852866
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.