网页自动化最直觉的做法,是把 HTML 全部交给模型,或者每一步都截图。前者充满无关标签,后者慢、贵,而且坐标不稳定。
Hermes 选择无障碍树作为默认页面表示,让模型先理解“这里有什么控件”,再通过元素引用操作。
这篇只回答一个问题:Agent 怎样以较低成本理解并操作没有 API 的网页?
Hermes 给出的答案是:用长驻浏览器保持状态,以 accessibility tree 提供紧凑语义和元素引用,通过九类动作交互;页面变化后刷新引用,视觉只做必要补充。
HTML、截图和语义树各自解决不同问题
原始 HTML 信息完整,却包含大量布局与样式噪声;截图接近人类视觉,但调用慢、token 成本高,坐标还会随页面变化。
accessibility tree 提供按钮、链接、输入框的语义名称和引用编号,适合大多数表单与导航任务。它看不到视觉样式,因此不是对截图的完全替代。
操作链必须遵守“观察—动作—再观察”
Agent 先 navigate 或 snapshot 获取页面结构,再用 ref 点击和输入。页面跳转或局部更新后,旧 ref 可能指向不存在的元素。
因此页面变化后必须重新获取快照。把元素引用当成长期 ID,会让后续动作作用于错误位置或直接失败。
视觉是降级路径,不是默认路径
当网站无障碍标注差、图表信息只存在视觉层时,Agent 可以调用 browser_vision;必要时也可用 console 查询 DOM。
大部分结构化操作仍应从语义树开始。每一步都走视觉会让简单任务变慢,也把稳定元素定位变成不稳定坐标判断。
浏览器状态需要按任务隔离
Hermes 使用长驻 Chromium,因此登录 cookie、localStorage 和表单状态会自然延续,不需要像终端那样导出 snapshot。
每个 task_id 使用独立会话,避免主 Agent 与子 Agent 或不同任务共享登录和页面状态。状态连续与状态隔离必须同时成立。
一次网页搜索如何执行
Agent 先调用 browser_navigate 打开页面,工具返回当前 accessibility tree。模型从树中找到搜索框的语义名称和 ref,再通过 browser_type 输入关键词,使用 browser_press 或 browser_click 提交。
页面发生变化后,Agent 必须重新获取 snapshot。新的树会生成新的 ref,旧编号不再可靠。接下来模型读取搜索结果中的链接语义,继续点击或滚动。
如果目标信息只存在图表、画布或视觉布局中,才升级到 browser_vision;无障碍标注缺失时,也可以用 console 查询 DOM。三条路径不是互相替代,而是按信息成本逐级降级。
长驻 Chromium 保留 cookie 和 localStorage,让多步操作保持登录态;task id 则隔离不同任务。一个可靠的浏览器 Agent,需要同时维护 页面快照的新鲜度 与 浏览器会话的连续性。
三个容易走偏的地方
- 每次动作都截图并调用视觉模型,让速度和成本失控。
- 页面已经变化仍使用旧 ref,导致误点或找不到元素。
- 只抓 HTML,不处理 JavaScript 渲染、交互和登录状态。
产品经理可以怎样评审
评审这项能力,可以先检查三条:
- 页面表示应按任务升级:语义树优先,DOM 和视觉作为补充。
- 浏览器自动化的基本循环是每次关键变化后重新观察,而不是连续猜测。
- 长期登录状态必须与任务隔离、凭据权限和可见会话一起设计。
原材料未展开反检测、代理和云浏览器,本文不把本地浏览器路径包装成所有网站都可稳定自动化。
