agent-browser & tmux — AI 编码助手的核心自动化工具
5 步标准操作流程,引用在每次快照后重新分配
agent-browser open url # 1. 打开页面 agent-browser snapshot -i # 2. 获取可交互元素及引用 agent-browser click @e3 # 3. 通过引用操作元素 agent-browser snapshot -i # 4. 页面变化后重新快照 agent-browser close # 5. 关闭浏览器
click / dblclick / hover / focus / fill / type / press / check / select / upload / download / drag / scroll
@eN 引用定位、语义定位 (role/text/label/placeholder)、CSS 选择器、testid 定位
screenshot (普通/全页/标注)、PDF 导出、视频录制 (start/stop webm)
cookie 状态 save/load、多 session 并行、多 profile 管理、auth vault 凭证安全存储
tab 切换与关闭、iframe 内操作、dialog accept/dismiss
元素出现、文本匹配、URL 变化、networkidle、DOM 就绪、自定义 JS 条件
请求路由/拦截、Network HAR 导出、Console 日志、JS 错误捕获、Performance Trace
eval / eval --stdin / eval -b (base64)、页面脚本注入
# 表单填写 agent-browser open https://example.com/form agent-browser snapshot -i agent-browser fill @e2 "user@test.com" agent-browser fill @e3 "password123" agent-browser click @e5 agent-browser wait --text "Success" # 语义定位(无需引用) agent-browser find role button click --name "Submit" agent-browser find label "Email" fill "user@test.com" agent-browser find placeholder "Search" type "query" agent-browser find testid "submit-btn" click # 认证复用 agent-browser open https://app.example.com/login agent-browser fill @e1 "admin" && agent-browser fill @e2 "pass" agent-browser click @e3 && agent-browser wait --url "**/dashboard" agent-browser state save ./auth.json # 下次直接复用登录态 agent-browser --state ./auth.json open https://app.example.com/dashboard # 截图取证 agent-browser screenshot --full full.png agent-browser screenshot --annotate map.png # 标注版,编号对应 @eN 引用
| 命令 | 说明 |
|---|---|
| snapshot -i | 获取可交互元素列表(推荐) |
| click / dblclick @eN | 点击 / 双击元素 |
| fill / type @eN "text" | 清除并输入 / 追加输入 |
| press Enter / Control+a | 按键 / 组合键 |
| check / uncheck @eN | 勾选 / 取消复选框 |
| select @eN "value" | 下拉选择 |
| upload @eN file.pdf | 上传文件 |
| scroll down 500 | 页面滚动 |
| screenshot / screenshot --full | 截图 / 全页截图 |
| record start / record stop | 开始 / 停止录屏 |
| state save / state load | 保存 / 恢复浏览器状态 |
| tab new / tab t2 / tab close | 标签页管理 |
| wait @eN / --text / --url | 等待元素 / 文本 / URL |
| network route / har | 网络拦截 / HAR 导出 |
| eval "document.title" | 执行 JavaScript |
独立 socket 隔离,send-keys 发送指令,capture-pane 读取输出
SOCKET_DIR="${TMPDIR:-/tmp}/clawdbot-tmux-sockets" mkdir -p "$SOCKET_DIR" SOCKET="$SOCKET_DIR/clawdbot.sock" SESSION=clawdbot-python # 创建隔离会话 tmux -S "$SOCKET" new -d -s "$SESSION" -n shell # 发送命令 tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'python3 -q' Enter # 抓取输出 tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200
send-keys(字面量 send -l、控制键 C-c)、按键组合、安全输入避免 shell 注入
capture-pane 获取最近 N 行历史、wait-for-text.sh 等待特定模式出现
new-session / list-sessions / list-panes / kill-session / kill-server
多 session 同时运行多个 coding agent,统一轮询完成状态,汇总结果
Python REPL (需 PYTHON_BASIC_REPL=1)、长时间运行进程的监控与控制
多窗格布局、窗格间切换、窗格大小调整、attach / detach 与会话持久化
# 创建多个隔离 session SOCKET="${TMPDIR:-/tmp}/codex-army.sock" for i in 1 2 3 4 5; do tmux -S "$SOCKET" new-session -d -s "agent-$i" done # 在不同 workdir 启动 agent tmux -S "$SOCKET" send-keys -t agent-1 "cd /tmp/proj1 && codex --yolo 'Fix bug X'" Enter tmux -S "$SOCKET" send-keys -t agent-2 "cd /tmp/proj2 && codex --yolo 'Fix bug Y'" Enter # 轮询完成状态 for sess in agent-1 agent-2; do if tmux -S "$SOCKET" capture-pane -p -t "$sess" -S -3 | grep -q "❯"; then echo "$sess: DONE" else echo "$sess: Running..." fi done # 获取完整输出 tmux -S "$SOCKET" capture-pane -p -t agent-1 -S -500
| 命令 | 说明 |
|---|---|
| tmux -S $SOCKET new -d -s NAME | 创建后台会话 |
| tmux -S $SOCKET send-keys -t target -l "cmd" | 安全发送字面量文本 |
| tmux -S $SOCKET send-keys -t target C-c | 发送 Ctrl+C |
| tmux -S $SOCKET capture-pane -p -t target -S -200 | 抓取最近 200 行输出 |
| tmux -S $SOCKET list-sessions | 列出所有会话 |
| tmux -S $SOCKET list-panes -a | 列出所有窗格 |
| tmux -S $SOCKET attach -t SESSION | attach 到会话 |
| tmux -S $SOCKET kill-session -t NAME | 终止会话 |
| tmux -S $SOCKET kill-server | 关闭整个 socket 服务 |
| wait-for-text.sh -t target -p 'regex' | 等待输出中出现特定模式 |