乐于分享
好东西不私藏

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

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 支持的操作类型

类别
操作
生命周期管理
start / stop / install无头与可见模式切换、CDP 连接
导航操作
open / navigate / navigate_back / close多标签页管理
元素交互
click / type / hover / drag / press_keyselect_option / fill_form / file_upload
页面感知
snapshot(ARIA 无障碍树解析)screenshot / pdfconsole_messages / network_requests
Cookies
cookies_get / cookies_set / cookies_clear
高级
CDP 连接、浏览器缓存清理

整个模块支持 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 作为进程级单例管理:

类型
说明
playwright
Playwright 实例
async_playwright() 返回值
browser
Chromium
浏览器实例
context
BrowserContext
单上下文,管理所有页面
pages
{page_id: Page}
多标签页映射
refs
{page_id: {ref: {…}}}
ARIA ref → 元素信息
console_logs
{page_id: [log]}
控制台日志收集
network_requests
{page_id: [req]}
网络请求记录
pending_dialogs
{page_id: [Dialog]}
待处理对话框队列
pending_file_choosers
{page_id: [FC]}
待处理文件选择器
headless
bool
无头模式标志
current_page_id
str
当前活动页面 ID
page_counter
int
页面 ID 单调计数器

这个设计很巧妙:用进程级单例避免重复创建浏览器,同时通过 page_id 支持多标签页操作。


四、33 个 Action 完整解析

这是最硬核的部分,QwenPaw 一共实现了 33 种浏览器操作(不是 25 种):

4.1 生命周期管理(4 个)

Action
行号
说明
start
L640-817
启动浏览器,支持 headed=True 可见窗口、cdp_port 调试端口
stop
L819-923
关闭浏览器,清空全部状态
install
L2066-2127
执行 playwright install 安装浏览器
clear_browser_cache
L2710-2820
清除浏览器缓存

4.2 导航操作(4 个)

Action
行号
说明
open
L925-994
新建页面并导航到 URL
navigate
L997-1048
当前页面导航到新 URL
navigate_back
L1624-1653
浏览器后退
close
L1515-1557
关闭指定页面

4.3 页面感知(3 个)

Action
行号
说明
snapshot
L1560-1621
ARIA 无障碍树快照,生成 ref 引用
screenshot
L1051-1170
截图,支持全页/元素/iframe
pdf
L1481-1512
页面导出为 PDF

4.4 元素交互(8 个)

Action
行号
说明
click
L1173-1307
点击,支持双击/右键/修饰键
type
L1310-1422
输入文本,支持逐字符/提交
hover
L2372-2438
鼠标悬停
drag
L2284-2369
拖拽元素
press_key
L2130-2173
键盘按键
select_option
L2440-2514
下拉框选择
fill_form
L1965-2063
批量表单填充
file_upload
L1901-1962
文件上传

4.5 JavaScript 执行(3 个)

Action
行号
说明
eval
L1425-1478
页面级 JS 执行
evaluate
L1656-1741
元素级 JS 执行(指定 ref)
run_code
L2223-2281
等同 eval 的别名

4.6 信息获取(2 个)

Action
行号
说明
console_messages
L1792-1839
获取控制台日志
network_requests
L2175-2220
获取网络请求记录

4.7 标签页与视口(3 个)

Action
行号
说明
tabs
L2517-2631
标签页:list/new/close/select
resize
L1744-1789
调整视口大小
wait_for
L2634-2707
等待:时间/文本出现/消失

4.8 对话框处理(1 个)

Action
行号
说明
handle_dialog
L1842-1898
处理 alert/confirm/prompt 对话框

4.9 Cookies 管理(3 个)

Action
行号
说明
cookies_get
(文档中提到)
获取 Cookies
cookies_set
(文档中提到)
设置 Cookies
cookies_clear
(文档中提到)
清除 Cookies

4.10 CDP 高级功能(2 个)

Action
行号
说明
connect_cdp
L2882-2955
连接到已运行的 Chrome CDP 端口
list_cdp_targets
L2823-2879
扫描本地 CDP 端口可用目标

这 33 个动作覆盖了浏览器操作的方方面面,Agent 有了这些能力,几乎可以完成任何网页自动化任务。


五、ARIA 无障碍树解析

这是整个模块最核心的技术亮点。

5.1 角色分类

分类
示例角色
数量
生成 ref
交互角色
button, link, textbox, checkbox, radio, combobox, listbox, menuitem, searchbox, slider, spinbutton, switch, tab, treeitem
17 种
始终生成
内容角色
heading, cell, gridcell, columnheader, rowheader, listitem, article, region, main, navigation
10 种
有 name 时生成
结构角色
generic, group, list, table, row, rowgroup, grid, treegrid, menu, menubar, toolbar, tablist, tree, directory, document, application, presentation, none
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[strdict[strdict]]

处理流程:

  1. 按行解析 ARIA YAML 格式
  2. 正则提取 role 和 name
  3. 按角色分类分配 ref(e1, e2, e3…)
  4. tracker 追踪同名元素的 nth 索引
  5. 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 级监听

事件
收集内容
用途
console
{level, text}
Agent 调试分析
request
{url, method, resourceType}
网络分析
response
回填 status 到 request
状态码
dialog
Dialog 对象队列
handle_dialog 处理
filechooser
FileChooser 队列
file_upload 处理

6.2 Context 级监听

新标签页:target=_blank → 自动注册为 page_N → 设为当前页面

这个自动处理很贴心,Agent 打开新标签页时不需要手动切换。


七、CDP 高级功能

QwenPaw 支持通过 Chrome DevTools Protocol (CDP) 进行高级浏览器控制:

功能
说明
connect_cdp
连接到已运行的 Chrome 浏览器(需暴露调试端口)
list_cdp_targets
扫描本地 CDP 端口可用目标

⚠️ 注意:CDP 模式会暴露浏览器历史、Cookies 等敏感信息,使用前须告知用户。


八、错误处理

统一 try-except,所有错误返回 {"ok": false, "error": "..."}

  • _action_stop 使用 finally 保证状态清理
  • _ensure_browser() 自动启动
  • ref 未找到: “Unknown ref: eN”
  • Playwright 未安装: 带安装提示的 ImportError

这种统一的错误处理方式,让 Agent 能够准确感知操作是否成功。


九、性能优化

优化点
说明
进程级单例
避免重复创建浏览器
惰性启动
首次需要时才启动
compact 模式
减少快照 token 消耗
interactive 模式
仅输出可交互元素
静态资源过滤
network_requests 默认过滤图片/样式/字体
页面 ID 不复用
单调计数器避免混淆

这些优化都很实用,特别是 compact 模式和 interactive 模式,能大大减少 token 消耗,对 AI 对话非常友好。


总结

QwenPaw 的浏览器自动化模块设计得相当扎实,核心亮点总结如下:

  1. 统一入口:33 种操作通过一个 browser_use 函数完成
  2. ARIA 语义解析:用 ref 引用代替 CSS 选择器,稳定性更高
  3. 进程级单例:避免重复创建浏览器,性能更好
  4. 事件监听系统:自动收集控制台日志和网络请求
  5. 多标签页支持:自动管理 page_id,简化 Agent 操作
  6. CDP 高级支持:可连接到已运行的 Chrome 进行调试

这套系统让 AI Agent 具备了”看”网页、”操作”网页的能力,是实现复杂自动化任务的基础。

好了,浏览器自动化模块就聊到这里。觉得有帮助的点个赞、在看,转发给需要的朋友。咱们下期见。