Skip to content

【内置浏览器】【观察协议】实现 AX Tree 剪枝 DOM、稳定 RefMap 与分层快照 #261

Description

@CavinHuang

关联主问题:#251
依赖:#260

类型

观察协议 / 剪枝 DOM / 元素引用

背景

当前 DOMSnapshot.captureSnapshot 在复杂页面可超过 1 MB,超过 150 KB 后只返回截断提示,Agent 因而失去页面结构。截图和模型猜测 selector 无法替代稳定的结构化观察。

参考实现

参考 agent-browser 的 native snapshot:

  • Accessibility.getFullAXTree 作为主体
  • DOM 批量扫描补充 cursor:pointer、onclick、tabindex、contenteditable 等 AX Tree 遗漏节点
  • 清理 ignored/generic/冗余结构
  • iframe 与 Shadow DOM 纳入同一语义树
  • 可操作节点映射到 backendDOMNodeId,并生成 @en

锁定方案

  • 默认返回完整的紧凑语义树;interactive_only 为可选模式
  • RefMap 绑定 sessionId、tabId、snapshotId、navigationGeneration、frameId、backendDOMNodeId、role/name/nth
  • Ref 在 BrowserSession 内单调递增且不复用
  • backendDOMNodeId 失效时仅允许同 Tab、同导航代次、同 Frame、语义完全一致且候选唯一的安全重绑定
  • 真正隐藏元素不进入快照;可滚动到的 offscreen 元素保留并标记
  • 大型树完整保留在宿主,模型通过 scope/cursor 分层读取,禁止整体截断
  • 动作后根据结果返回完整树、局部变化树或目标最新状态
  • annotated screenshot 使用相同 refs;坐标操作绑定 screenshotId 和视口代次

验收标准

  • 百度等大型页面不再返回 DOM too large 空提示
  • 快照能稳定暴露输入框、按钮、标题、结果链接和控件状态
  • iframe/Shadow DOM 中的 ref 可直接用于动作,不要求模型切 Frame
  • 旧 ref 永远不会在新快照中指向另一个元素
  • scope/cursor 过期时返回 STALE_SNAPSHOT_CURSOR
  • 截图滚动、缩放或布局变化后旧坐标返回 STALE_SCREENSHOT

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions