导航与定位
先找到,再动手。找不到就报错,不猜。
- 打开、后退、前进、刷新。地址规整;非 URL 文本走当前搜索引擎。
- XPath 或 CSS 选择器。点击、输入、选择必须恰好匹配一个;匹配多个直接失败,不取第一条。
- 穿透 Shadow DOM 与 iframe。pierce 查同源 iframe;顶层找不到时自动查跨域 iframe(OOPIF)。
- 画布与坐标点选。没有稳定节点时用视口坐标或截图坐标;page_hit 反查命中的元素。
一套环境一套登录。Agent 在同一扇窗口里点击、填表、等待、提取结果;你随时可以接管。 Windows / macOS / Linux,全部在本机。
一个真实任务:在 GitHub 的 browser-automation 话题页取前 5 个仓库,导出 CSV。 画面从工作流画布开始,经过填写参数、「Agent 正在操作浏览器」的遮罩与页面加载,到运行记录里的条数与文件路径。
35 秒 · 无声循环 · 实录它不是录屏回放,也不是把每一步都交回给模型重新想。做通一次之后,步骤可以存成工作流, 下一次只调用一次 workflow_run。

在 Claude Code、Kimi Code、Cursor 里说一句要做什么;Agent 通过本机 MCP 调 BrowserPilot 的工具。做通一次后,也可以存成工作流,填参数直接执行。

打开页面、定位元素、等待渲染、点击与填写。Agent 操作时盖遮罩,点「接管」立刻交还。

每次运行留下成功/失败、停在哪一步、输出与文件。做通一次的步骤可以写成工作流,之后一次调用跑完。
每条都对应一个 MCP 工具或一个已实现的界面行为。已支持 = 当前版本可用;实验性 = 有实现但依赖外部条件; 未支持 = 不承诺,建议交接给人。
先找到,再动手。找不到就报错,不猜。
把人的输入动作拆成可重放的步骤。
登录留在环境里,不留在对话里。
不写死 sleep,让页面自己说什么时候好了。
先把页面读成数据,再谈自动化。
网页触发的下载也接管。
出问题时有现场,不靠猜。
只把能稳定做的写成熟支持。
Agent 直连适合一次性任务;保存工作流适合重复操作;人机协作适合登录、核验和需要人把关的步骤。
在 Claude Code、Kimi Code、Cursor 里说一句,Agent 通过 MCP 逐步调用工具:快照、定位、点击、等待、提取。适合一次性任务和还没形成固定流程的事。
终端和浏览器自动化最容易让人不放心的是控制权。下面写的是代码里的实际行为,不是承诺。
| 控制状态 | 页面上的表现 | 谁在操作 |
|---|---|---|
| agent | 盖一层「Agent 正在操作浏览器」,中央是「接管」。 | Agent;你点「接管」立刻交还。 |
| handoff | 遮罩去掉,页面顶部留一句提示;下一步目标出现时重新上锁。 | 人;工作流交接最多等 10 分钟(下一个节点有定位时)。 |
| shared | 没有遮罩。 | 人和 Agent 同时操作;任务不暂停。 |
人点「接管」或 Agent 调 page_unlock 后,控制权变成 shared,任务继续。 工作流返回 takenOver: true,Agent 应该重新读页面再决定下一步。
用 page_handoff 或工作流「交接」节点。窗口如果是无头的,会先显示出来; 交接节点会等下一个目标出现,最长 10 分钟;下一个节点没有定位时会立即重新上锁。
登录态在 Electron 的 persist 分区;MCP 只监听 127.0.0.1,Bearer 令牌写在本机 mcp.json。应用不把 Cookie 发给云端。
env_export 是给换机用的,文件里是完整 Cookie。只在本机传递,不要贴到对话、 仓库或工单里;不用时删掉。
主动写清楚不做的部分,比说「什么都能做」更有用。下面每一条都能在代码或发布配置里找到对应。
workflow_run 跑完整图。MCP 是主入口:Agent 通过它调用 67 个工具。CLI 是同一套工具的薄封装,适合脚本与计划任务。 应用内没有定时器。
{
"mcpServers": {
"browserpilot": {
"type": "http",
"url": "http://127.0.0.1:39221/mcp",
"headers": { "Authorization": "Bearer REPLACE_WITH_TOKEN" }
}
}
} 先打开 BrowserPilot → 设置 → 通用 → MCP。REPLACE_WITH_TOKEN 换成 %APPDATA%\BrowserPilot\mcp.json 里的 token;不要贴到对话或仓库。
"%LOCALAPPDATA%\Programs\BrowserPilot\resources\cli\browserpilot.exe" tools
"%LOCALAPPDATA%\Programs\BrowserPilot\resources\cli\browserpilot.exe" schema page_click
"%LOCALAPPDATA%\Programs\BrowserPilot\resources\cli\browserpilot.exe" call workflow_run --name "GitHub 话题速览" --json-file C:\tasks\github.json github.json 里写 {"话题":"browser-automation"}。CLI 目前只按 Windows 的 %APPDATA% 路径读 mcp.json;macOS / Linux 用 MCP。
{
"workflow": "GitHub 话题速览",
"rows": [
{ "话题": "browser-automation" },
{ "话题": "headless-browser" }
],
"concurrency": 2
}并发上限 3。每行仍是一次完整的工作流运行,各自有运行记录;默认一行一行来。
set BROWSERPILOT_EXE=%LOCALAPPDATA%\Programs\BrowserPilot\BrowserPilot.exe
"%LOCALAPPDATA%\Programs\BrowserPilot\resources\cli\browserpilot.exe" ^
call workflow_run --name "GitHub 话题速览" --json-file C:\tasks\github.json 存成 browserpilot-morning.bat,再用 schtasks /Create /SC DAILY /ST 09:00 /TN "BrowserPilot 早报" /TR "C:\tasks\browserpilot-morning.bat"。 CLI 会先等应用起来,最多 45 秒。
三者解决的不是同一类问题。下面只写客观差异,不排名。
窄屏可以左右滑动,查看完整对照。
| 维度 | 手写 Playwright / Puppeteer | 传统 RPA | BrowserPilot |
|---|---|---|---|
| 起步 | 写代码、装浏览器、处理驱动与启动参数。 | 装 RPA 软件,录制或拖流程;桌面版通常按席位收费。 | 装桌面应用,把本机 MCP 注册给 Agent;不需要写脚本也能先跑。 |
| 登录态 | 自己维护 storageState / Cookie,过期就重新登录。 | 常依赖桌面会话或内置浏览器,账号切换靠配置。 | 登录留在环境的 persist 分区;一套环境多个网站,关窗不丢。 |
| 网站改版 | 选择器失效,改代码、跑测试、发版。 | 元素路径失效,回编辑器改流程。 | 同样会失效;失败带匹配数、文字和现场截图,定位更快,但没有自动修复。 |
| 重复运行 | 脚本进 CI 或计划任务;需要自己写重试与报告。 | 自带计划任务与日志,适合固定流程。 | workflow_run 一次跑完整图;workflow_batch 多行输入,最多 3 并发。 |
| 谁决定下一步 | 你写的代码。 | 录好的流程。 | Agent 规划;做通后存成工作流回放。BrowserPilot 自身不带模型。 |
| 适合 | 工程团队、CI、需要版本化与代码评审的场景。 | 固定的内部系统、财务/人事等表单流程。 | 本机、已登录、需要人随时接管的网页任务;不适合无桌面的服务器。 |
版本、驱动、定位方式、并发、凭据与数据落盘位置。数字来自仓库与当前安装包,不写估测。
| 版本 | 0.13.13(2026-10-09 tag) |
|---|---|
| 运行时 | Electron 44 · React 19 · TypeScript 5;Windows 安装包 117.6 MiB,解压后约 460 MB |
| 驱动方式 | Electron WebContentsView + Chrome DevTools Protocol(Input / DOM / Accessibility / Network) |
| 定位 | XPath 或 CSS;必须恰好匹配一个;可穿透 Shadow DOM、同源 iframe,顶层找不到时查跨域 iframe |
| 运行模式 | 有头优先;无头 = 窗口隐藏(同一 Chromium),默认上限 3 扇,可在设置里调 |
| 并发 | workflow_batch 最多 3 路(设置上限);不同环境各自一扇窗口 |
| 凭据 | 登录态在 Electron 的 persist 分区;MCP 只监听 127.0.0.1,Bearer 令牌在本机 mcp.json |
| 平台 | Windows x64 · macOS(Apple Silicon)· Linux x64;CI 三端构建,当前素材在 Windows 采集 |
| 网络 | 应用无账号体系;市场目录从 GitHub 读取;媒体合并首次会从镜像下载 ffmpeg |
| 许可 | 仓库暂未附 LICENSE 文件;源码公开可读,再分发前请先确认授权 |
| 数据目录 | Windows %APPDATA%BrowserPilot;macOS ~/Library/Application Support/BrowserPilot;Linux ~/.config/BrowserPilot |
下面五张都来自 0.13.13 的 Windows 运行,统一窗口 1440 × 900。没有 mockup。

保存好的工作流带参数;填完点执行,或交给 Agent 调 workflow_run。

页面盖遮罩,中央是「接管」;人点一下就能拿回控制权。

成功/失败、停在哪一步、输出、文件;失败自动附现场截图。

22 种节点从左向右连;Agent 不点图,仍用 workflow_run 一次跑完。

MCP 只听 127.0.0.1,默认端口 39221;批量并发与无头窗口上限也在这里。
主进程、界面、Go CLI 与工作流市场都在公开仓库里。三条命令起本地开发环境。
$ git clone https://github.com/xy200303/browserpilot
$ npm install
$ npm run dev 构建:npm run build;类型检查:npm run typecheck; 打包:npm run dist:win(或 dist:mac / dist:linux)。
只写仓库查得到的提交。这个项目的小版本很密,下面三条都是 2026-10-09 的。
完整历史见 GitHub Releases。
默认没有逐次点击确认——Agent 调 page_click 就会点。需要人把关的步骤,用 page_handoff 或工作流里的「交接」节点:遮罩去掉、页面留提示,人做完下一步才重新上锁。付款、删除、发布这类页面建议放在交接之后,只让 Agent 做只读操作。
一套环境就是一个 Electron persist 分区。登录一次,关掉窗口再打开还在;不同环境互不可见。删环境会清掉 Cookie。换机器用 env_export / env_import 导出导入 Cookie;导出文件是明文,只在本机用,不要发到对话或仓库里。
选择器会失效,BrowserPilot 不会自动修复。失败时会带匹配个数、文字和现场截图;用 page_query 或 page_snapshot 重新找定位,再改工作流节点。运行记录里能看到停在哪一步。
不能。它是桌面应用,需要图形会话;所谓无头只是把窗口隐藏,仍是同一个 Chromium。MCP 只监听 127.0.0.1,不对外网开放。需要远程执行时,用远程桌面连到那台机器。
都在本机用户数据目录:Windows 是 %APPDATA%BrowserPilot,macOS 是 ~/Library/Application Support/BrowserPilot,Linux 是 ~/.config/BrowserPilot。截图在 screenshots,运行记录在 runs.json,抓包 HAR 在 runs,导出 CSV 在 exports,下载在 downloads。应用没有账号与云端同步。
自动支持的是极验 v4 滑块:cv、ddddocr、onnx 三引擎降级,拟人拖拽并重试。其它类型用 captcha_panel 截图交给会看图的 Agent,成功率取决于题型和模型;英数文字可以用 ddddocr,需要本机 Python。图标点选、五子棋、交换消除没有内置识别器,建议交接给人。
能。每个账号一套环境,各自一扇窗口、各自的登录。批量运行 workflow_batch 默认一行一行来,并发最多 3;同时开着的无头窗口默认也最多 3,可在设置里调。
BrowserPilot 去掉了自己会加的自动化标记:不带 --enable-automation,UA 用同版本 Chrome 标识、不出现 Electron 或 HeadlessChrome,默认输入走 CDP 的 Input 域。它不是指纹浏览器,不做指纹伪装,也不承诺绕过站点风控;判定在网站一侧。