Rodney v0.4.0:面向 Coding Agent 的浏览器自动化 CLI · 干货攻略
- 链接: https://x.com/simonw/status/2023896441085948069
- 分类: x-tips
- 来源: X @simonw
- 作者: Jay
- 更新: 2026-09-15
- 仓库: simonw/rodney
这是什么
Rodney 是 Simon Willison 用 Go 编写的命令行浏览器自动化工具,基于 go-rod/rod 库实现。与 Playwright/Puppeteer 等面向人类开发者的工具不同,Rodney 从第一天起就是为 coding agent 和 shell 脚本设计的。
核心设计:Chrome 以长驻进程运行(通过 Chrome DevTools Protocol 的 WebSocket),每次 rodney CLI 调用是一个短生命周期进程,连接到这个共享的 Chrome 实例执行一条命令后退出。这意味着你可以把浏览器自动化写成普通的 shell 脚本。
当前版本为 v0.4.0(2026 年 2 月 17 日发布),官方博文 提到该版本吸引了 5 位贡献者的 PR,是 Rodney 首次公开发布一周后的一次重大社区驱动更新。
为什么值得关注
AI coding agent(如 Cursor、Copilot、Claude Code)运行在终端环境中,能直接调用 shell 命令。Rodney 将浏览器自动化变成了一条 shell 命令,agent 无需任何 SDK 绑定或特殊协议接入——直接 rodney open URL 就能驱动浏览器。
与主流方案相比: - Playwright:面向开发者,需 Python/JS SDK;AI agent 需通过 MCP 等中间层接入 - Puppeteer:Node.js 生态,同上 - Rodney:纯 CLI,shell 即接口,DAU(Deterministic Accessibility Tree)输出紧凑,不会轻易撑爆 context window
v0.4.0 的多贡献者发布证明了小而专的工具也能快速聚拢社区——5 位贡献者在一周内提交了 9 项功能增强,从 Windows 支持到 accessibility testing 命令,体现了极强的工程迭代速度。
核验过程
- 官方来源 1:X @simonw 原文 — "New release of Rodney, my CLI tool for browser automation (designed for use by coding agents and with Showboat) - contributions from five people!"(2026-02-17)
- 官方来源 2:GitHub simonw/rodney README — 含架构说明、完整命令列表、安装方式
- 官方来源 3:Simon Willison 博客 v0.4.0 发布说明 — 含详细 changelog 和多贡献者背景
- 官方来源 4:GitHub Releases 页面 — v0.4.0(2026-02-17)、v0.3.0(2026-02-10)、v0.2.0(2026-02-10)、v0.1.0(2026-02-09)四个版本时间线
- 交叉验证:Tavily 搜索 "Rodney CLI simonw browser automation 2026",确认生态博客 N+1 Blog 浏览器自动化全景图 将 Rodney 纳入 AI Agent 生态,定位为 Playwright CLI 的对标竞品
结论:原帖所述"多贡献者新版本"属实;Rodney 专为 coding agent 设计的定位在 README 和博客中均明确;版本号 v0.4.0 可在 GitHub Releases 交叉确认。
上手步骤
安装依赖
环境要求:
- Go 1.21+(源码编译)
- Google Chrome 或 Chromium(Linux/Windows/macOS 均支持)
- 可选:设置 ROD_CHROME_BIN=/path/to/chrome 指定浏览器路径
安装 Rodney(当前无预编译二进制,需自行编译):
git clone https://github.com/simonw/rodney.git
cd rodney
go build -o rodney .
# 将 rodney 二进制加入 PATH
核心命令一览
启动与状态
rodney start # 启动 headless Chrome(后台常驻)
rodney start --show # 启动带可视化窗口的 Chrome
rodney start --local # 仅当前目录的 session(状态存在 ./.rodney/)
rodney start --insecure # 忽略 TLS 证书错误(-k 简写)
rodney connect host:9222 # 连接远程已有的 Chrome debug port
rodney status # 查看当前浏览器状态
rodney stop # 关闭 Chrome 并清理状态
页面导航
rodney open https://example.com # 导航到 URL
rodney open example.com # 自动补 http://
rodney back # 后退
rodney forward # 前进
rodney reload # 刷新
rodney reload --hard # 硬刷新(跳过缓存)
rodney clear-cache # 清除浏览器缓存
信息提取
rodney url # 打印当前 URL
rodney title # 打印页面标题
rodney text "h1" # 获取元素文本
rodney html "div.content" # 获取元素 HTML
rodney attr "a#link" href # 获取元素属性值
rodney screenshot # 截图保存为 screenshot.png
rodney screenshot page.png # 指定文件名
rodney screenshot -w 1280 -h 720 out.png # 指定视口尺寸
rodney screenshot-el ".chart" chart.png # 仅截图特定元素
rodney pdf output.pdf # 导出 PDF
JavaScript 执行
rodney js document.title # 执行 JS,打印返回值
rodney js "1 + 2" # 数学运算
rodney js 'document.querySelector("h1").textContent'
rodney js '[1,2,3].map(x => x * 2)' # 返回 JSON 格式的 pretty-print 结果
元素交互
rodney click "button#submit" # 点击元素
rodney input "#search" "query" # 输入框填值
rodney clear "#search" # 清空输入框
rodney file "#upload" photo.png # 文件上传
rodney select "#dropdown" "value" # 下拉框选择
rodney submit "form#login" # 表单提交
rodney hover ".menu-item" # 悬停
rodney focus "#email" # 聚焦元素
等待与同步
rodney wait ".loaded" # 等待元素出现且可见
rodney waitload # 等待 page load 事件
rodney waitstable # 等待 DOM 稳定(不再变化)
rodney waitidle # 等待网络空闲
rodney sleep 2.5 # 等待指定秒数
Tab 管理
rodney pages # 列出所有 Tab(* 标记当前活动页)
rodney newpage https://... # 在新 Tab 打开
rodney page 1 # 切换到指定 Tab
rodney closepage 1 # 关闭指定 Tab
断言与检查(退出码语义)
rodney exists ".loading" # 元素存在 → exit 0;不存在 → exit 1
rodney visible "#modal" # 元素可见 → exit 0;不可见 → exit 1
rodney count "li.item" # 打印匹配元素数量
rodney assert 'document.title' 'Home' # 相等 → exit 0;不等 → exit 1
Rodney 区分三种退出码: - exit 0:成功 - exit 1:检查失败(条件不满足) - exit 2:命令执行错误(参数错误、无浏览器会话、超时等)
这使得 set -e 风格的 shell 脚本可以自然地处理检查失败。
Accessibility 测试(v0.2.0 新增)
rodney ax-tree # 导出完整 accessibility 树
rodney ax-tree --depth 3 # 限制深度
rodney ax-tree --json # JSON 格式输出
rodney ax-find --role button # 按 role 查找所有元素
rodney ax-find --name "Submit" # 按可访问名称查找
rodney ax-find --role button --name "Home" --json # 组合过滤
rodney ax-node "h1" --json # 查看单个元素的 a11y 属性
完整自动化示例
#!/bin/bash
set -euo pipefail
FAIL=0
check() {
if ! "$@"; then
echo "FAIL: $*"
FAIL=1
fi
}
rodney start
rodney open "https://example.com"
rodney waitstable
check rodney exists "h1"
check rodney visible "#main-content"
check rodney assert 'document.title' 'Example Domain'
check rodney ax-find --role navigation
rodney screenshot
rodney stop
if [ "$FAIL" -ne 0 ]; then
echo "Some checks failed"
exit 1
fi
echo "All checks passed"
与 Showboat 集成
Simon 用 Showboat(另一款工具)制作功能演示,v0.4.0 的 rodney assert、rodney reload --hard、rodney 退出码 和 rodney start --local 都有配套演示。Rodney 设计上天然适合作为 Showboat 这类 agent 演示工具的后端。
坑与适用边界
-
无预编译二进制:Rodney 目前没有提供 pip/brew/apt 的预编译包,必须
go build编译,对于没有 Go 环境的用户有上手门槛。官方文档建议直接go build -o rodney .编译。 -
需要自备 Chrome/Chromium:不捆绑浏览器,安装时需确保系统已有 Chrome。
ROD_CHROME_BIN环境变量可指定非标准路径。 -
local vs global session 的隐式切换:
--local和--global标志可以出现在命令任意位置(rodney start --local和rodney --local start等价),但未指定时默认先查当前目录的./.rodney/state.json,找不到才用全局 session。新用户可能对此行为感到困惑。 -
JavaScript 表达式的返回值约定:
rodney js将表达式自动包装为() => { return (expr); },因此只能返回有意义的值(不能是undefined)。对于需要执行副作用的场景(如设置window.value = 42)不适合。 -
非交互式设计:Rodney 是纯 CLI,不提供 Python/JS SDK 式的编程接口。如果你需要在自己的应用代码里驱动浏览器而非写 shell 脚本,应该直接使用 go-rod 库本身。
-
并发限制:所有命令共享同一个 Chrome 实例和活动 Tab,不支持多标签页并发自动化(需要自行管理 Tab 切换)。
一句话结论
Rodney 将浏览器自动化变成了一条 shell 命令,是当前 AI coding agent 生态中门槛最低、最符合 agent 交互范式的浏览器控制工具——如果你需要让 agent 操作网页,Rodney 值得优先考虑。