浏览器 agent 的演示总让人以为,难点是模型能不能“看懂网页”。真正跑过动态站点以后,你会遇到更狼狈的问题:模型刚才决定点击第 17 个元素,菜单刷新了一次,第 17 个已经变成另一件东西。
Browser Use 最值得拆的不是点击,而是 referential integrity——网页不停变化时,一个动作怎样仍然指向原来的对象。
它给模型看的不是原始 DOM
每一步,DomService 会通过 Chrome DevTools Protocol 并行取得四组信息:完整 DOM tree、各 frame 的 Accessibility Tree、包含几何与 paint order 的 DOMSnapshot,以及 device pixel ratio。DOM.getDocument 使用 pierce 穿透 Shadow DOM;iframe 则需要额外处理坐标、滚动和跨域 target。
这些数据按 backend node ID 合并成 enhanced tree。一个 button 因而不只有标签和文本,还有 accessible name、role、computed style、屏幕 bounds、是否可见、是否有 click listener、位于哪个 frame 等信息。
随后 serializer 才做减法:过滤脚本和装饰节点,判断交互性,按 paint order 去掉被遮挡元素,用 bounding box 合并重复包装层,最后给可操作元素分配短 index。模型看到的是为行动压缩过的页面状态,而不是十万行 HTML。
截图也没有消失。当前实现每步都会捕获 screenshot 供历史和云同步使用,但是否真的送进 LLM 取决于 use_vision:true 每步发送,auto 只在动作明确请求时发送,false 不发送。视觉是补充通道,不是 DOM 失败后的神秘开关。
页面变化后,怎样重找元素
Browser Use 会把已交互元素的多种身份保存进 history。重放或继续动作时,它按五级 fallback 搜索当前 selector_map:
- 完整 element hash;
- 过滤 focus、hover、animation 等动态 class 的 stable hash;
- DOM 结构位置对应的 XPath;
- 相同节点类型加 accessible name;
- 唯一的
name、id或aria-label。
这个顺序从最精确走向最宽松。hash 防止点错同名按钮,AX name 能跨过 SPA 重排,attribute 则兼容旧 history。全部失败时,正确行为不是猜,而是承认对象已经不存在。
为什么这比视觉识别更基础
视觉模型能认出“蓝色提交按钮”,却未必知道它属于哪个 iframe、被什么层遮挡、点击后是否仍是同一语义对象。DOM 与 Accessibility Tree 提供结构身份,snapshot 提供可见几何,截图提供布局语境。三者不是竞争关系,而是同一对象的不同证据。
我的思考
Browser Use 最先与 QA、运营自动化、数据采集和需要复用现有网页系统的开发者共鸣。大量企业不会为 agent 重写 API,浏览器仍是最后一公里;稳定的对象引用因此比更聪明的模型更能决定成功率。
市场会从“能自动点网页”走向“能证明点了什么”。涉及求职、采购、金融和医疗表单时,一次错误点击可能产生真实责任。产品需要在动作前显示目标身份,在动作后保存页面状态和结果,而不是只留一段模型自述。
我额外认为,浏览器 agent 会迫使网站重新重视 accessibility。稳定的 role、name 和 label 不只帮助人,也帮助自动化正确理解界面。无障碍语义可能从合规成本变成 agent 时代的机器可操作接口;那些结构混乱、只靠视觉拼出来的网站,会同时对两类用户变得更难用。