AI在执行任务途中给自己写工具:browser-harness的设计哲学
多数浏览器自动化框架想解决的问题是”帮人操作浏览器”。browser-harness 想解决的是另一件事:让 AI 在操作浏览器的途中给自己造工具。
592 行代码是一种立场
browser-harness 的全部 Python 代码约 592 行:
- •
run.py:36 行,程序入口 - •
helpers.py:195 行,初始工具函数集 - •
admin.py+daemon.py:361 行,守护进程与协议桥接
Playwright 的核心库是数万行,Selenium 更老也更重,browser-use 主库属于中型规模。
592 行不是赶工出来的,而是刻意为之:只给 AI 一个最小完备的接口,其余部分让 AI 自己补。
run.py 的核心逻辑四行:
def main():
print_update_banner()
ensure_daemon()
exec(sys.stdin.read(), globals())
helpers.py 里的所有函数预导入到 globals(),AI 通过 stdin 传入 Python 脚本,exec 直接执行。没有插件系统,没有工具注册机制,没有回调框架。AI 拿到的是一个有二十多个函数可用的 Python 命名空间,剩下的自己处理。
直连 CDP,不封装
浏览器自动化框架通常在 Chrome DevTools Protocol(CDP)上建一层抽象。Playwright 的 page.click(selector) 背后是一套元素定位、可见性检查、滚动等待逻辑——对人类开发者很友好,对 AI agent 是不透明的黑盒。
browser-harness 的链路:
Chrome → CDP WebSocket → daemon.py → Unix socket → run.py
单条 WebSocket 连接,守护进程做桥接,cdp(method, session_id, **params) 直接发送原始 CDP 命令。AI 看到的就是协议本身。
其中一个直接好处是:坐标点击可以穿透 iframe、shadow DOM 和跨域边界。
click(x, y) 底层调用 Input.dispatchMouseEvent,这是 CDP 合成器层的事件,不走 DOM 选择器路由。现代网页大量使用 iframe 嵌套、Web Components 和跨域内容,DOM 选择器在这些场景下要么失效,要么需要繁琐的上下文切换。坐标点击绕开了这个问题。
截图优先:看到再动
browser-harness 的标准操作循环:截图 → 读坐标 → 点击 → 截图验证。
screenshot() # 看页面现状
click(342, 218) # 点击对应坐标
screenshot() # 确认结果
goto(url) 导航后不返回页面结构,page_info() 只给视口尺寸和滚动状态,不给 DOM 树。AI 必须先截图,才能决定下一步。
这个设计有一个实际依据:网站的 DOM 结构会变,但屏幕上的视觉位置相对稳定。每次从视觉状态出发,比依赖可能过时的选择器更可靠。
自愈:任务途中补写工具
helpers.py 里的函数是初始工具集,但 AI 可以在任务执行中途编辑这个文件、加入新函数,然后在同一次任务里直接调用。
项目描述里写得直接:“The agent writes what’s missing, mid-task”。
传统框架遇到能力缺口会报错,或者要开发者去扩展插件。browser-harness 把这件事交给 AI 自己:发现缺什么,写什么,写完继续干。
2026 年 4 月 22 日有一条修复提交,处理的是这个机制的边界问题:Python comprehension 在 exec() 作用域里的变量绑定行为和普通函数不同,AI 在自行补写工具时容易踩坑。这条提交由 Gregor Žunič 与 Claude Opus 4.7 共同署名——AI 本身是这个仓库的代码贡献者之一。
68 个网站的集体记忆
domain-skills/ 目录下有 68 个子目录,每个对应一个网站,记录:
- • URL 模式和查询参数
- • 私有 API 端点和请求结构
- • 稳定选择器(
data-*、aria-*、role属性优先) - • 框架特有的等待条件和交互陷阱
覆盖 Amazon、LinkedIn、GitHub、SEC EDGAR、arXiv、TradingView、Spotify、Steam、Craigslist 等。
这些文件不是手写文档。每次 agent 解决了一个新网站的操作难题,就把发现的有用信息写进对应的 skill 文件,供下次使用,也供其他 agent 继承。
skill 文件有明确的禁止项:不记录像素坐标(截图每次重取)、不记录运行旁白、不记录凭证。只记录可复用的结构性信息。
与 Playwright 的差异不只是代码量
| browser-harness | Playwright | |
|---|---|---|
| 代码量 | ~592 行 | 数万行 |
| 协议层 | 直接 CDP | CDP 封装 |
| 跨域点击 | 合成器层,原生支持 | 需要 frame 上下文切换 |
| 自愈能力 | AI 在运行时补写 | 无 |
| 技能复用 | domain-skills 目录 | 无 |
| 适合场景 | AI agent 驱动 | 人工编写测试脚本 |
Playwright 的封装对人类友好,但对 AI 意味着一个不透明的中间层。browser-harness 去掉这层,AI 直接面对协议和视觉状态。
一个值得观察的方向
browser-harness 属于 browser-use 生态,是这个生态里走极简路线的分支。
做法是:给 AI 最小的初始能力集,剩余能力在执行任务的过程中自行构建,有价值的经验沉淀为可复用的领域技能。
这个设计比较务实:先跑起来,遇到缺口就补,补完继续。相比大而全的框架,它更像一个能自我生长的脚手架。
代码库在这里:github.com/browser-use/browser-harness
夜雨聆风