浏览器自动化
Wesclaw 提供三层浏览器与桌面自动化能力,覆盖从服务端匿名抓取到用户浏览器操作的完整场景。
三层自动化架构
| 层级 | Adapter | CellSpec 字段 | 运行时位置 | 适用场景 |
|---|---|---|---|---|
| Headless Browser | adapter/headless-browser/ | .HeadlessBrowser | 服务端(chromedp) | 匿名网页抓取 |
| Playwright | adapter/playwright/ | .Playwright | 服务端子进程 + 用户浏览器 | 需要登录态的操作 |
| Desktop Agent | adapter/desktop/ | .Desktop | 客户端二进制(AX-5) | 桌面应用自动化 |
┌─────────────────────────────────┐
│ Cell (per-tenant 隔离域) │
│ ├── HeadlessBrowser (可选) │ ← 服务端 chromedp
│ ├── Playwright (可选) │ ← 用户浏览器扩展
│ └── Desktop Agent (可选) │ ← 客户端原生二进制
└─────────────────────────────────┘
Playwright 配置
Playwright 用于需要用户登录态的浏览器自动化场景。
启用方式
在 CellSpec 中配置 .Playwright 字段(非 nil 即启用):
spec := wesgine.CellSpec{
Playwright: &wesgine.PlaywrightConfig{
// 用户浏览器模式
},
}
工作流程
- 安装浏览器扩展:用户安装 Wesclaw 浏览器扩展
- 自动连接:扩展通过 auto-connect token 连接到 Cell
- Agent 操作:Agent 通过
cell.Playwright()Handle 控制浏览器
管理 API
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /cells/{id}/playwright/status | 查看连接状态 |
| PUT | /cells/{id}/playwright/token | 更新 auto-connect token |
使用示例
# 检查 Playwright 连接状态
GET /cells/main/playwright/status
# 响应示例
{
"connected": true,
"browser": "chrome",
"version": "126.0"
}
HeadlessBrowser 配置
HeadlessBrowser 用于匿名网页抓取,不需要用户登录态。
启用方式
spec := wesgine.CellSpec{
HeadlessBrowser: &wesgine.HeadlessBrowserConfig{
// 配置选项
},
}
CellSpec.HeadlessBrowser 非 nil 即启用。
运行时位置
HeadlessBrowser 运行在服务端,使用 chromedp(Chrome DevTools Protocol):
Cell → adapter/headless-browser/ → chromedp → Chrome 实例
查看状态
GET /cells/main/headless-browser/state
浏览器 HITL(browser_wait_for_user)
browser_wait_for_user 是浏览器自动化的安全阀,属于 AlwaysOn 工具:
工作方式
- Cell boot 时无条件注册此工具
- 当 Agent 遇到需要用户手动操作的页面(如登录、验证码),暂停自动化
- 通知用户进行操作
- 用户完成后,Agent 继续执行
触发场景
| 场景 | 说明 |
|---|---|
| 登录页面 | 需要用户输入凭据 |
| 二次验证 | 短信/邮箱/TOTP 验证 |
| CAPTCHA | 需要人类完成验证 |
| 支付确认 | 需要用户授权支付 |
| 权限授权 | OAuth 等授权流程 |
关键特性
- AlwaysOn:不需要显式配置,Cell boot 自动注册
- 安全阀:防止自动化在不应操作的页面继续执行
- HITL 类型:属于 Agent 主动交互,不是治理链产生
Playwright vs HeadlessBrowser 选型
决策树
需要浏览器自动化?
├── 否 → 不配置任何浏览器选项
├── 需要用户登录态?
│ ├── 是 → Playwright(mode=user + 浏览器扩展)
│ └── 否 → HeadlessBrowser(服务端 chromedp)
└── 需要桌面应用自动化?
└── 是 → Desktop Agent(CellSpec.Desktop)
对比表
| 特性 | Playwright | HeadlessBrowser |
|---|---|---|
| 运行位置 | 用户浏览器 + 服务端子进程 | 服务端 chromedp |
| 登录态 | ✅ 保留用户登录状态 | ❌ 匿名会话 |
| 用户干预 | ✅ 支持 HITL | 较少需要 |
| Cookie | ✅ 用户的真实 Cookie | ❌ 空 Cookie |
| 适用场景 | SaaS 平台操作、需认证的抓取 | 公开网页抓取、截图 |
| CellSpec 字段 | .Playwright | .HeadlessBrowser |
常见误区
| 误区 | 正确做法 |
|---|---|
| 用 HeadlessBrowser 做需登录的操作 | 使用 Playwright mode=user |
| 用 Playwright 做匿名抓取 | 使用 HeadlessBrowser(更轻量) |
PostBoot 手写 cell.MCPs().Upsert("playwright", ...) | 使用 CellSpec.Playwright 声明式配置 |
连接状态查看
Playwright 状态
GET /cells/{id}/playwright/status
返回浏览器扩展的连接状态、浏览器类型和版本。
HeadlessBrowser 状态
GET /cells/{id}/headless-browser/state
返回 Headless 浏览器实例的运行状态。
Desktop Agent 状态
GET /cells/{id}/desktop/status
返回桌面 Agent 的连接状态。
Desktop Agent
Desktop Agent 是 Wesclaw 独有能力(其他产品无此特性),通过原生二进制实现桌面自动化。
配置方式
spec := wesgine.CellSpec{
Desktop: &wesgine.DesktopConfig{
Command: "/path/to/wesclaw-device-agent",
Transport: "stdio",
},
}
提供的工具
| 工具 | 功能 | 平台 |
|---|---|---|
wesclaw_desktop_click | 点击 UI 元素 | macOS (Accessibility) / Windows (UIA) |
wesclaw_open_app | 打开应用 | Launch Services / ShellExecute |
wesclaw_clipboard_read | 读取剪贴板 | 全平台 |
wesclaw_clipboard_write | 写入剪贴板 | 全平台 |
wesclaw_screenshot | 截屏 | 全平台 |
wesclaw_notify | 系统通知 | 全平台 |
wesclaw_show_file | 文件定位 | Finder / Explorer |
关键约束
- wesgine 提供
adapter/desktop/标准 adapter - Wesclaw 负责编译/打包原生二进制
- 客户端只有一个物理桌面 → device agent 内部 mutex 保证串行
- 断开时(Electron 关闭)→ MCP tools 从 Cell 视图消失
故障排查
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| Playwright 连接失败 | 扩展未安装 | 安装浏览器扩展 |
| Playwright token 过期 | Token 需要更新 | PUT /playwright/token |
| Headless 启动失败 | Chrome 未安装 | 安装 Chrome/Chromium |
| Desktop Agent 无工具 | 二进制不存在 | 检查 binary 路径 |
| 自动化被阻断 | 需要用户操作 | 响应 HITL 请求 |