案例 Browser Use 0.12:把Playwright换成CDP,浏览器Agent的一次底层重构

2026-05-08 07:16:05 +0800 CST views 13

Browser Use 0.12:把Playwright换成CDP,浏览器Agent的一次底层重构

GitHub: https://github.com/browser-use/browser-use
Star: ~60K
版本: 0.12
发布平台: 程序员茄子(chenxutan.com)
标签: Browser Agent, CDP, Playwright, 浏览器自动化, AI Agent, 架构重构


引言

上个月,Browser Use 发布了 0.12 版本。

乍一看是个小版本号更新,但 changelog 写得很直白:

把 Playwright 换成了 CDP。

官方数据:

  • 成功率:78% → 93%
  • 速度提升:35%
  • 内存占用减少:40%

这些数字背后,是浏览器 Agent 正在经历的底层架构思考——不是换工具,是换思路


一、Browser Use 是什么

项目定位

Browser Use 是一个开源的 Python 库,让 AI Agent 能像人一样操作浏览器。

它不是简单的"调用 Selenium API",而是把浏览器变成一个可以被 Agent 直接感知、决策、行动的环境。

GitHub 数据

  • Star: ~60K
  • 语言: Python
  • 协议: MIT

典型使用场景

场景说明
自动填表自动识别表单字段并填写
爬取动态网页处理 JavaScript 渲染的页面
多步骤在线任务"去某网站查航班、筛选价格、截图发给我"

二、0.12 之前:用 Playwright 的思路

Playwright 是什么

Playwright 是现在做浏览器自动化最主流的选择:

  • 文档完善 ✅
  • 生态成熟 ✅
  • 社区活跃 ✅

Playwright 的问题

Playwright 是给人用的,不是给 Agent 用的。

举个例子:

Playwright 的 click() 方法,默认会:

  1. 等待元素可见
  2. 等待元素可点击
  3. 执行点击

这很人性化——人操作浏览器也是这样,先看到元素,再点击。

Agent 不需要"等待"

Agent 需要的是:

拿到当前页面状态 → 做决策 → 执行动作 → 拿到结果状态

中间的"等待元素可见"这个步骤,在 Agent 的视角里是个黑盒

  • Agent 不知道自己在等什么
  • Agent 不知道为什么要等
  • Agent 不知道等多久

结论:Agent 对浏览器的控制不够直接。


三、CDP 是什么

定义

CDP = Chrome DevTools Protocol

Chrome 浏览器的底层调试协议。

对比

工具定位
Playwright给人用的遥控器
CDP给开发者用的手术刀

CDP 提供的能力

能力说明
直接操作 DOM 节点不需要选择器封装
监听网络请求和响应实时获取网络数据
拦截和修改请求完全控制网络层
模拟用户输入事件原生事件模拟
获取页面渲染状态真实页面状态

核心区别

CDP 不做"人性化封装"。

它不替你判断元素是否可见,不替你等待加载完成。它只提供最底层的接口,你怎么用是你的事。

这恰恰是 Agent 需要的

Agent 不需要框架替它做决策。Agent 需要的是:拿到原始数据,自己做判断,然后直接执行。


四、0.12 做了什么

架构变化

之前:Agent → Browser Use → Playwright → 浏览器

现在:Agent → Browser Use → CDP → 浏览器

中间的 Playwright 层被去掉,Agent 直接通过 CDP 控制浏览器。

具体改动

1. 元素定位方式变了

方式PlaywrightCDP
定位CSS 选择器 / XPath直接获取 DOM 树
操作click(), fill()DOM.dispatchEvent
逻辑依赖框架封装Agent 自己处理

2. 页面状态获取变了

方式PlaywrightCDP
方法page.content()DOM.getDocument
返回处理后的 HTML原始 DOM 树
内容基础结构Shadow DOM + iframe 内部

Agent 能看到更真实的页面结构。

3. 动作执行变了

方式PlaywrightCDP
行为自带等待、重试、错误处理直接发送事件
控制框架控制Agent 控制
灵活性受限完全自主

五、为什么成功率提升了

官方数据

指标之前现在提升
成功率78%93%+15%

提升原因

1. 更精确的元素定位

问题

  • Shadow DOM
  • 动态加载的 iframe
  • React/Vue 渲染的虚拟 DOM

Playwright 的选择器在这些场景下容易失效。

解决
CDP 能拿到原始 DOM 树,定位更可靠。

2. 更直接的错误反馈

方式错误信息
Playwright"元素不可点击"、"超时"(高层抽象)
CDP节点不存在、事件发送失败(底层协议)

Agent 能更准确地理解失败原因,然后调整策略。

3. 更灵活的动作策略

Playwright 的 click()

等待 → 检查 → 点击 → 等待结果

固定的行为模式。

CDP 的方式

先滚动页面 → 模拟鼠标移动 → 点击

整个流程由 Agent 控制。


六、速度和内存的改进

官方数据

指标改进
速度提升 35%
内存减少 40%

原因分析

去掉了一层封装。

Playwright 自带的功能

  • 自动等待
  • 智能选择器
  • 跨浏览器兼容
  • 截图和录制
  • 错误恢复

这些功能都需要内存和计算资源。

CDP 的方式

  • 只加载 Agent 需要的功能
  • 不需要的功能不加载

更轻量,更快。


七、一个比喻

之前的设计

给 Agent 配了一个司机。

Agent 说"去某地",司机负责:

  • 开车 ✅
  • 等红绿灯 ✅
  • 找停车位 ✅

现在的设计

给 Agent 直接配了一辆车。

Agent 自己开。

对比

方式优点缺点
配司机省心指令会被解读和过滤
直接配车完全自主需要自己处理驾驶细节

对于真正想自主行动的 Agent,后者更合适。


八、这意味着什么

正在发生的趋势

Agent 用的工具,正在从"人用的工具封装版",变成"专为 Agent 设计的原始版"。

行业案例

项目公司思路
OperatorOpenAIAgent 直接操作浏览器
Computer UseAnthropicAgent 直接操作系统
Project AstraGoogleAgent 原生能力

核心逻辑

Agent 不需要人性化封装,Agent 需要的是最大程度的可控性和透明度。

人性化封装是给人用的。Agent 用这些封装,反而是障碍。


九、对开发者的影响

代码层面

  • API 变化不大,大部分代码可以直接升级
  • 依赖 Playwright 特性的功能需要调整

调试层面

  • CDP 更底层
  • 调试信息也更底层
  • 需要习惯看协议级别的日志

性能层面

  • 资源占用更少
  • 可以在同一台机器上跑更多 Agent 实例

建议

升级是值得的。更稳定、更快、更轻。


十、底层架构的思考

核心问题

我们给 Agent 配的工具,到底应该是"人用工具的简化版",还是"Agent 自己设计的原生版"?

过去的做法

把人用的工具封装成 API,然后让 Agent 调用:

  • 搜索引擎 ✅
  • 浏览器 ✅
  • 代码编辑器 ✅

局限性

封装层会:

  • 损失信息 ❌
  • 引入延迟 ❌
  • 限制灵活性 ❌

Browser Use 0.12 的思路

直接把原始能力给 Agent,让 Agent 自己处理细节。

这是一个更"信任 Agent"的设计哲学。

前提条件

Agent 有足够的能力处理原始数据。

现在的 LLM 在这方面已经够用了。


十一、技术对比总结

Playwright vs CDP

维度PlaywrightCDP
定位人用工具底层协议
封装高度封装无封装
等待自动等待手动控制
错误高层抽象底层协议
灵活性受限完全自主
透明度黑盒白盒
Agent 适用⚠️ 一般✅ 完美

十二、总结

核心价值

价值说明
成功率提升78% → 93%
速度提升35%
内存减少40%
架构变化从封装到原生

设计哲学

从"给 Agent 配司机"变成"给 Agent 直接配车"。

核心洞察

Agent 不需要人性化封装,Agent 需要的是原始能力和自主空间。

适用范围

这个道理,不止适用于浏览器自动化,也适用于正在涌现的各类 Agent 工具。


本文首发于「程序员茄子」博客,原文链接:https://chenxutan.com

推荐文章

介绍Vue3的静态提升是什么?
2024-11-18 10:25:10 +0800 CST
Nginx 防盗链配置
2024-11-19 07:52:58 +0800 CST
支付页面html收银台
2025-03-06 14:59:20 +0800 CST
Go 语言实现 API 限流的最佳实践
2024-11-19 01:51:21 +0800 CST
18个实用的 JavaScript 函数
2024-11-17 18:10:35 +0800 CST
Go中使用依赖注入的实用技巧
2024-11-19 00:24:20 +0800 CST
Vue3中的Store模式有哪些改进?
2024-11-18 11:47:53 +0800 CST
【SQL注入】关于GORM的SQL注入问题
2024-11-19 06:54:57 +0800 CST
Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
Go 中的单例模式
2024-11-17 21:23:29 +0800 CST
Nginx 如何防止 DDoS 攻击
2024-11-18 21:51:48 +0800 CST
程序员茄子在线接单