游乐游手机版
首页/AI教程/文章详情

AI自动化操作浏览器原理与browser use实现机制深度解析

时间:2026-07-11 14:32
AIAgent操作浏览器主要有两种方式:截图加坐标的视觉方案和文本树加编号的无障碍树方案。后者通过Playwright将页面转换为带ref编号的YAML语义树,LLM根据编号调用工具操作元素,实现多步交互。视觉方案仅在文本树失效时补充使用。

AI Agent 操作浏览器,目前主流的方式其实就两种。一种是把页面截图发给大模型,大模型返回一个 (x, y) 坐标,自动化工具就在那个坐标上模拟点击;另一种是把网页转换成一棵带编号的文本树,大模型从树里挑编号,自动化工具按编号定位到真实的 DOM 元素再执行操作。

现在市面上主流的 AI Agent CLI——Gemini CLI、Claude Code、Codex——默认采用的基本都是第二种方案:文本树加编号。只有在需要视觉识别的时候,才切换回第一种。接下来,我们结合 x-code-cli 的源码,把这两种实现方式的原理拆开揉碎了讲清楚。

为什么需要 browser use

很多 AI Agent 自带的 webFetch 工具,确实能抓取网页内容。但本质上,它只是一个无状态的 HTTP 请求——没有登录态、不执行 Ja vaScript、也不支持多步交互。下面这几个场景,它就完全无能为力:

  • 需要登录的后台页面。webFetch 没有 cookie 和 session,拿到的只能是登录页面的空白。
  • SPA 单页应用。fetch 拿到的内容是

    ,真正的页面内容得等浏览器执行完 Ja vaScript 才能渲染出来。
  • 多步交互任务。筛选、翻页、填表单、点击详情——这些操作需要保持页面状态,不可能靠一次抓取就完成。

这些恰恰是 browser use 发挥价值的地方:通过 Playwright 这类浏览器自动化工具,启动一个真正的浏览器,执行登录、渲染、点击、填表等操作,就像人一样操作页面。

反过来,如果只是读一篇公开的静态文章,webFetch 抓取一次就足够了;如果是搜索信息,用 webSearch 工具。所以分类很简单:读取静态公开页面,webFetch 够用;遇到需要登录、需要 JS 渲染、或者需要多步交互的场景,才轮到 browser use 上场。

LLM 自动判断

用户不需要自己去判断什么时候该用哪个。LLM 会根据工具描述自行判断当前任务适合 webFetch 还是 browser use。以 x-code-cli 为例,browser 这个子 agent 的工具描述里写得清清楚楚。

LLM 读到这段描述后,会根据用户的需求自行决定是否委派给这个子 agent。

当然,这最终取决于 LLM 的判断能力和工具描述的质量。描述写得到位,模型本身也够强,委派基本都能命中;但如果页面“看起来像静态”,或者 LLM 偏弱,可能会误用 webFetch 导致抓不到内容。

实战演示

直接用一个真实例子来看效果。注意,browser use 不是默认开启的,需要先使用 /browser on 命令手动启用,或者配置 browser.enabled: true

在终端启动 x-code-cli 后,输入这样一条命令:

这个任务 webFetch 是完成不了的。去哪儿网是纯 SPA 站点,航班数据靠 JS 动态加载,而且需要先输入出发地、目的地、出发日期,最后点击搜索——四步交互缺一不可。webFetch 连第一步都过不去。

注意,上面这条命令里没有提到“浏览器”也没有提到“browser use”,全是 LLM 自己判断该用哪个工具。

LLM 根据 browser 子 agent 的工具描述做出判断:SPA、需要多步交互,应该委派给 browser 子 agent。browser 子 agent 会静默启动一个新的 Chrome 进程,不会打扰到用户正在进行的活动。

Browser 子 agent 打开去哪儿首页,填表单、点搜索,等搜索结果加载完后获取文本树快照——航班号、时间、价格都在快照里,LLM 直接提取。

LLM 看到的页面:从 HTML 到语义树

继续用去哪儿搜机票这个例子。浏览器打开首页后,LLM 到底“看到”了什么?

页面里有大量样式、脚本和 DOM 节点,但发给 LLM 的并不是这些原始内容。经过 Playwright MCP server 的转换,LLM 收到的是这样一段 YAML 文本:


- tab "国内机票" [ref=e2] [selected] [cursor=pointer]
- tab "国际·港澳台机票" [ref=e3] [cursor=pointer]
- radio "单程" [ref=e5] [checked] [cursor=pointer]
- radio "往返" [ref=e6] [cursor=pointer]
- textbox "出发城市" [ref=e8]: 北京(BJS)
- button "换" [ref=e10] [cursor=pointer]
- textbox "到达城市" [ref=e12]: 上海(SHA)
- textbox "出发日期" [ref=e15]: 2026-07-12
- button "搜索" [ref=e20] [cursor=pointer]

LLM 不处理像素,也不解析 HTML,它拿到的是这棵语义树。树里每个可交互元素都带了一个 [ref=eNN] 编号:e8 是出发城市输入框,e12 是到达城市输入框,e15 是出发日期,e20 是搜索按钮。LLM 通过工具调用来操作页面——比如调用 browser_fill_form 把 e8 设为“北京”、e12 设为“上海”,再调用 browser_click 点击 e20,搜索就触发了。搜索完成后页面跳转到结果页,MCP 服务端返回一份新快照,里面是完整的航班列表——厦门航空 MF8561 07:50-09:45 ¥400、东航 MU9192 20:45-23:10 ¥420、中联航 KN5977 20:50-22:55 ¥420……

LLM 直接从中提取出最便宜的 3 个就行了,然后输出到终端。browser use 的大部分逻辑都围绕这棵树展开,后面几节将拆解它是怎么生成的。

两种元素定位方式

这两种方式的区别,在于 LLM 通过什么途径获取页面信息,以及如何定位要操作的元素。

方式 A:截图 + 坐标(视觉方案 / computer use)
把页面截图发给 LLM,LLM 返回一个 (x, y) 坐标,浏览器自动化工具就在该坐标模拟点击。这种方式必须用多模态模型,成本更高;坐标也不稳定——页面改版或分辨率变了,坐标就失效了;而且推理速度慢。但 canvas 渲染的应用、游戏、视频、远程桌面这类内容没有 DOM 语义,文本树是空的,只能采用视觉方式。Anthropic 的 Computer Use、OpenAI 的 Operator 采用的就是这种方案。

方式 B:文本树 + 编号(无障碍树 + ref)
把页面转换成带编号的文本树,LLM 根据快照中的 ref 编号发起工具调用(比如 browser_click 点击 e20 搜索按钮),浏览器自动化工具按编号找到对应的真实 DOM 元素并执行操作。这个方案不需要视觉能力,任何 LLM 都可以做到,包括 DeepSeek 这种纯文本模型。

这两种方式不是二选一的,实际中一般是混合使用:文本树负责常规操作,截图在文本树覆盖不到的场景做补充。

从网页到带编号的文本树

源头:浏览器一直在维护这棵树

每个主流浏览器内核里都维护着一棵无障碍树——根据 DOM 树、CSS 计算样式、ARIA 属性综合生成的语义结构。它原本是给屏幕阅读器、语音控制等辅助技术用的,存在了十几年,远早于 AI agent。browser use 直接复用了这种技术:无障碍树天生就是为程序解析页面内容而设计的,给 LLM 用正好合适。

为例,它在无障碍树里会被解析为以下内容:

  • 角色(role):button(来自
  • 名字(name):"提交"(来自元素的文本内容)
  • 是否可交互:是
  • 当前状态:是否 disabled、是否 expanded 等

其中角色和名字是浏览器推断出来的,主要有两个依据:

  1. HTML 原生语义。
  2. ARIA 属性补充。开发者用 role="dialog"aria-label="搜索" 这些属性告诉浏览器“这个

    是个对话框”。ARIA 是补充,不是必需的。

从浏览器里读出这棵树

读取无障碍树需要一个浏览器自动化工具。这里用的是 Playwright——微软开源的浏览器自动化框架,支持 Chrome、Firefox、WebKit,可以用代码控制浏览器做点击、填写、截图、读取页面内容等操作。前端开发者常用它写 E2E 测试,在 AI Agent 场景里,它被用作操控浏览器的底层引擎。

Playwright 本身是一个 Node.js 库,LLM 不能直接调用它。@playwright/mcp 这个 npm 包的作用就是把 Playwright 的能力包装成 MCP 工具——相当于给 Playwright 套了一层 LLM 能理解的接口。前面 YAML 快照示例里把 HTML 转成语义树的,就是它。

看整个读取流程:


LLM 调用 browser_snapshot 工具

@playwright/mcp 这个 MCP server 进程收到请求后,调用 Playwright 的 page.ariaSnapshot({ mode: "ai" })

Playwright 通过 CDP(Chrome DevTools Protocol)发送请求:Accessibility.getFullAXTree

浏览器内核返回完整的无障碍树(一个巨大的 JSON)

Playwright 做三件事:
1. 裁剪:去掉不可见节点、纯装饰节点
2. 编号:给每个可交互元素分配 ref 编号(e1, e2, e3...)
3. 序列化:渲染成 YAML 格式文本

YAML 快照作为工具返回值发送给 LLM

CDP 是 Chrome 暴露给外部工具的调试协议——Chrome DevTools 的检查元素、Network 面板底层用的就是 CDP。Accessibility.getFullAXTree 是 CDP 提供的 API 方法,专门用于读取页面的完整无障碍树,任何能连接 CDP 的工具都能调用。

为什么不直接用 DOM?因为 DOM 内容过于庞杂。一个普通页面可能有几千个节点,其中大量是样式容器(

)、SVG 图标、隐藏元素,这些对 LLM 来说是无效信息。无障碍树已经做了过滤:只保留有语义的内容,而且用角色统一了表达方式——不管 HTML 怎么写,按钮就是 button,链接就是 link

序列化:从无障碍树到 YAML

来看 ariaSnapshot({ mode: "ai" }) 的序列化逻辑:

来源:https://juejin.cn/post/7660466008562892835
上一篇图片放大模糊解析:从插值到AI超分辨率演进 下一篇Loop Engineering半年实战拆解:自进化开发系统已开源
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Hy3+WorkBuddy组合国产顶级Agent附完整提示词
AI教程 · 2026-07-11

Hy3+WorkBuddy组合国产顶级Agent附完整提示词

五个 Case 跑完,总结一下整体体验。工具使用能力:能不能自己开网页、找信息、标出处。规划能力:能不能把多约束需求拆成可执行步骤。长程执行能力:跨多步任务时会不会丢状态。复杂推理能力:能不能先推导、再写代码、再执行验证。WorkBuddy+Hy3 的表现完全符合预期。趁着 WorkBuddy 里的

AI Agent是什么?一文理解大语言模型、记忆、技能、工具、MCP、工作流与上下文
AI教程 · 2026-07-11

AI Agent是什么?一文理解大语言模型、记忆、技能、工具、MCP、工作流与上下文

智能体并非单一模型,而是由大语言模型、记忆、工具、工作流等模块协同构成的自主系统。它通过理解目标、检索记忆、调用工具、构建上下文、推理决策,并基于反馈闭环持续迭代,最终自主完成复杂任务。

DeepSeek决定自研芯片打造人工智能全新算力芯脏
AI教程 · 2026-07-11

DeepSeek决定自研芯片打造人工智能全新算力芯脏

被“逼”出来的第三条路。 一直以模型技术见长的DeepSeek,这次在算力供应链上迈出了让所有人侧目的一步。 2026年7月7日,路透社援引三位知情人士消息,DeepSeek正在悄然开发自有AI芯片。值得玩味的是,这颗芯片的定位非常精准——专攻推理,不涉足训练。消息人士称,项目大约启动于一年前,目前

开闭源模型实测:横评Sonnet 5与四大国产开源模型编程能力
AI教程 · 2026-07-11

开闭源模型实测:横评Sonnet 5与四大国产开源模型编程能力

今天,我们来深入实测一组闭源与开源模型的编程能力。Sonnet 系列上次更新停留在今年2月,随着Fable 5的解禁,Sonnet 5终于迎来升级。根据Claude官方数据,其整体表现优于Oups 4 6和4 7,略逊于Oups 4 8,但实际运行时,Sonnet 5的调用成本甚至比Opus更高。

SAM3与FastAPI实战:搭建智能图像标注工具
AI教程 · 2026-07-11

SAM3与FastAPI实战:搭建智能图像标注工具

基于SAM3与FastAPI构建智能图像标注工具,解决传统标注耗时痛点。SAM3支持开放词汇分割,输入文本即可自动分割。后端封装SAM3Service实现懒加载、特征缓存及多种分割模式,掩码可视化由后端生成PNGbase64。前端采用react-konva实现画布交互,API遵循RESTful风格,支持批量标注与导出。