AI Agent 平台 CoPaw 源码学习:系统核心——浏览器自动化模块

前言
大家好,我是高双喜。
前面咱们聊完了 QwenPaw 的 Agent 模块和记忆模块,AI Agent 是怎么操作浏览器的?
对于一个 AI Agent 来说,能”看到”网页内容、能”点击”按钮、能”填写”表单,这是实现复杂任务自动化的基础。QwenPaw 基于 Playwright 实现了完整的浏览器操作能力,整整 3481 行代码,可见其复杂度。
今天咱们就深入源码,看看这个浏览器自动化模块是怎么设计的。
一、模块概述
1.1 功能定位
浏览器自动化是 QwenPaw 最复杂的工具子系统,基于 Playwright 实现了完整的浏览器操作能力。通过统一的 browser_use 入口函数和 ARIA 无障碍树解析,Agent 可以像人一样浏览网页、填写表单、执行 JavaScript 等。
这个定位很清晰:让 AI Agent 能够操作浏览器,完成各种自动化任务。
1.2 支持的操作类型
|
|
|
|---|---|
| 生命周期管理 |
|
| 导航操作 |
|
| 元素交互 |
|
| 页面感知 |
|
| Cookies |
|
| 高级 |
|
整个模块支持 33 种动作,可以说把浏览器操作能覆盖的场景都覆盖了。
二、核心接口
2.1 browser_use 统一入口
这是整个模块的核心入口函数:
asyncdefbrowser_use( action: str, # 必填: 33 种动作之一 url: str = "", # URL ref: str = "", # ARIA ref 引用 (优先于 selector) selector: str = "", # CSS 选择器 (备选) text: str = "", # 输入文本 code: str = "", # JavaScript 代码 page_id: str = "default", # 页面 ID headed: bool = False, # 是否可见窗口 cdp_port: int = 0, # CDP 调试端口# ... 更多可选参数) -> ToolResponse
所有返回值统一为 {"ok": bool, ...} JSON 格式。这个设计很简洁,Agent 只需要调用同一个函数,传入不同的 action 参数就能完成各种操作。
2.2 通用操作流程
Agent 决定需要浏览器操作→ browser_use(action="start") # 启动浏览器→ browser_use(action="open", url="...") # 打开页面→ browser_use(action="snapshot") # 获取 ARIA 快照 + refs→ browser_use(action="click", ref="e3") # 通过 ref 交互→ browser_use(action="type", ref="e2") # 输入文本→ browser_use(action="screenshot") # 截图确认→ browser_use(action="stop") # 关闭浏览器
这是一个典型的浏览器操作流程:启动 → 打开 → 快照 → 交互 → 确认 → 关闭。每一步都有明确的目的。
三、全局状态管理
3.1 进程级单例
模块级字典 _state 作为进程级单例管理:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这个设计很巧妙:用进程级单例避免重复创建浏览器,同时通过 page_id 支持多标签页操作。
四、33 个 Action 完整解析
这是最硬核的部分,QwenPaw 一共实现了 33 种浏览器操作(不是 25 种):
4.1 生命周期管理(4 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.2 导航操作(4 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.3 页面感知(3 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
4.4 元素交互(8 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.5 JavaScript 执行(3 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
4.6 信息获取(2 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
4.7 标签页与视口(3 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
4.8 对话框处理(1 个)
|
|
|
|
|---|---|---|
|
|
|
|
4.9 Cookies 管理(3 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
4.10 CDP 高级功能(2 个)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
这 33 个动作覆盖了浏览器操作的方方面面,Agent 有了这些能力,几乎可以完成任何网页自动化任务。
五、ARIA 无障碍树解析
这是整个模块最核心的技术亮点。
5.1 角色分类
|
|
|
|
|
|---|---|---|---|
| 交互角色 |
|
17 种 |
|
| 内容角色 |
|
10 种 |
|
| 结构角色 |
|
18 种 |
|
5.2 解析流程
defbuild_role_snapshot_from_aria( aria_snapshot: str, # Playwright 原始 ARIA 输出 interactive: bool = False, # 仅交互元素 compact: bool = False, # 删除无 ref 结构节点 max_depth: int | None = None,) -> tuple[str, dict[str, dict]]
处理流程:
-
按行解析 ARIA YAML 格式 -
正则提取 role 和 name -
按角色分类分配 ref(e1, e2, e3…) -
tracker 追踪同名元素的 nth 索引 -
compact 模式移除无 ref 后代的结构节点
5.3 Ref 引用机制
格式:e1, e2, e3(单调递增) 数据:{ref: {"role": "button", "name": "搜索", "nth": null}}
优势:比 CSS 选择器更稳定,基于语义而非 DOM 结构。
快照输出示例:
- button "搜索" [ref=e1]- textbox "用户名" [ref=e2]- link "首页" [ref=e3]
这个设计太聪明了!传统的 CSS 选择器依赖 DOM 结构,网页稍微改版就失效了。而 ARIA ref 基于语义,稳定性大大提升。
5.4 元素定位
info = refs[page_id].get(ref) # {role, name, nth}locator = root.get_by_role(role, name=name)if nth > 0: locator = locator.nth(nth)
优先使用 get_by_role() 语义定位,而非 CSS 选择器。这和 ARIA ref 的设计理念一致。
六、事件监听系统
6.1 Page 级监听
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6.2 Context 级监听
新标签页:target=_blank → 自动注册为 page_N → 设为当前页面
这个自动处理很贴心,Agent 打开新标签页时不需要手动切换。
七、CDP 高级功能
QwenPaw 支持通过 Chrome DevTools Protocol (CDP) 进行高级浏览器控制:
|
|
|
|---|---|
|
|
|
|
|
|
⚠️ 注意:CDP 模式会暴露浏览器历史、Cookies 等敏感信息,使用前须告知用户。
八、错误处理
统一 try-except,所有错误返回 {"ok": false, "error": "..."}:
-
_action_stop使用 finally 保证状态清理 -
_ensure_browser()自动启动 -
ref 未找到: “Unknown ref: eN” -
Playwright 未安装: 带安装提示的 ImportError
这种统一的错误处理方式,让 Agent 能够准确感知操作是否成功。
九、性能优化
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这些优化都很实用,特别是 compact 模式和 interactive 模式,能大大减少 token 消耗,对 AI 对话非常友好。
总结
QwenPaw 的浏览器自动化模块设计得相当扎实,核心亮点总结如下:
-
统一入口:33 种操作通过一个 browser_use 函数完成 -
ARIA 语义解析:用 ref 引用代替 CSS 选择器,稳定性更高 -
进程级单例:避免重复创建浏览器,性能更好 -
事件监听系统:自动收集控制台日志和网络请求 -
多标签页支持:自动管理 page_id,简化 Agent 操作 -
CDP 高级支持:可连接到已运行的 Chrome 进行调试
这套系统让 AI Agent 具备了”看”网页、”操作”网页的能力,是实现复杂自动化任务的基础。
好了,浏览器自动化模块就聊到这里。觉得有帮助的点个赞、在看,转发给需要的朋友。咱们下期见。
夜雨聆风