浏览器自动化
CDP Chrome 自动化 — 快照、点击、导航、截图、标签页。通过基于 ref 的元素定位,使用 cli-jaw browser 命令控制 Chrome。
cli-jaw serve 正在运行,并且已安装 Google Chrome。快速参考
| 技能名称 | browser |
| 分类 | 自动化 |
| 状态 | 启用(默认加载) |
| 依赖 | cli-jaw 二进制文件、Google Chrome |
| 可选 | cliclick(Homebrew,用于基于坐标的点击) |
| 截图保存路径 | ~/.cli-jaw/screenshots/ |
| 相关技能 | desktop-control、web-ai、vision-click |
| 技能文件 | ~/.cli-jaw/skills/browser/SKILL.md |
前置条件
cli-jaw serve必须正在运行 — 浏览器技能通过 cli-jaw 服务器进行通信。- 必须安装 Google Chrome。
- 必须在 cli-jaw 项目中安装
playwright-core(用于 CDP 通信)。 - 可选:
brew install cliclick,用于基于坐标的鼠标操作。
核心工作流
所有浏览器自动化遵循相同的循环:先获取快照以查看可交互元素,然后通过 ref ID 执行操作,再获取快照以验证结果。
在导航、刷新、切换标签页或任何导致页面内容发生重大变化的操作后,请使用新的快照。Ref ID 属于最近一次可用的快照,可能会过时。
快速开始
# 启动自动化会话(无头模式,无可见窗口)
cli-jaw browser start --agent
# 启动交互式浏览器(手动模式,可见窗口)
cli-jaw browser start
# 导航到 URL
cli-jaw browser navigate "https://example.com"
# 获取交互式快照(显示 ref ID)
cli-jaw browser snapshot --interactive
# 点击一个 ref
cli-jaw browser click e3
# 输入文本并提交
cli-jaw browser type e5 "hello" --submit
# 截图
cli-jaw browser screenshot
快照输出
snapshot --interactive 命令返回页面上可交互元素的紧凑列表,每个元素都有一个短的 ref ID,供后续命令使用。
e2 link "Images"
e3 textbox "Search" ← 在此输入:type e3 "query"
e4 button "Google Search" ← 点击:click e4
e5 button "I'm Feeling Lucky"
像 e3 这样的 ref ID 是短期有效的,作用域仅限于最近一次快照。页面变化后请务必重新获取快照。
命令参考
浏览器管理
| 命令 | 描述 |
|---|---|
cli-jaw browser start [--port <auto>] [--headless] [--agent] | 启动 Chrome。--agent = 无头自动化模式;不加参数 = 可见交互模式。 |
cli-jaw browser stop | 关闭浏览器会话。 |
cli-jaw browser status | 报告当前 CDP 连接状态和端口。 |
cli-jaw browser doctor [--json] | 诊断 CDP/运行时所有权不匹配和孤儿进程清理范围。 |
cli-jaw browser cleanup-runtimes [--json] [--close --force] | 默认执行试运行。仅在使用 --close --force 时关闭 jaw 拥有的孤儿运行时。 |
cli-jaw browser reset [--force] | 清除浏览器配置文件和截图。仅在用户明确请求时使用。 |
观察
| 命令 | 描述 |
|---|---|
cli-jaw browser snapshot | 完整页面快照(所有节点)。 |
cli-jaw browser snapshot --interactive | 仅显示可交互元素及其 ref ID。推荐使用以节省 token 预算。 |
cli-jaw browser snapshot --interactive --max-nodes 30 --json | 限制节点数量并以 JSON 格式输出。 |
cli-jaw browser screenshot | 捕获当前视口。保存至 ~/.cli-jaw/screenshots/。 |
cli-jaw browser screenshot --full-page | 全页面截图(滚动捕获)。 |
cli-jaw browser screenshot --ref e5 | 通过 ref ID 截取特定元素。 |
cli-jaw browser screenshot --clip 0 0 320 180 --json | 裁剪区域截图,JSON 输出路径。 |
cli-jaw browser text | 提取页面所有可见文本。 |
cli-jaw browser text --format html | 以 HTML 格式提取页面内容。 |
cli-jaw browser get-dom --selector ".card" --max-chars 2000 --json | 获取匹配 CSS 选择器的 DOM 子树。 |
cli-jaw browser console --json --limit 20 | 获取控制台日志条目。 |
cli-jaw browser network --json --limit 20 | 获取网络请求日志。 |
操作
| 命令 | 描述 |
|---|---|
cli-jaw browser click e3 | 通过 ref ID 点击元素。 |
cli-jaw browser click e3 --double | 双击元素。 |
cli-jaw browser click e3 --right | 右键点击(上下文菜单)。 |
cli-jaw browser type e3 "hello" | 在输入框中输入文本。 |
cli-jaw browser type e3 "hello" --submit | 输入文本后按回车。 |
cli-jaw browser press Enter | 按下键盘按键(Enter、Escape、Tab 等)。 |
cli-jaw browser hover e5 | 悬停在元素上。 |
cli-jaw browser select e7 "option1" | 在下拉菜单中选择选项。 |
cli-jaw browser drag e3 e5 | 从一个元素拖拽到另一个元素。 |
cli-jaw browser mouse-click 400 300 | 在绝对坐标处点击。 |
cli-jaw browser mouse-click 400 300 --double | 在坐标处双击。 |
cli-jaw browser move-mouse 400 300 | 将鼠标移动到坐标处(不点击)。 |
cli-jaw browser mouse-down | 按下鼠标按钮。 |
cli-jaw browser mouse-up --right | 释放鼠标按钮(可选右键)。 |
导航和检查
| 命令 | 描述 |
|---|---|
cli-jaw browser navigate "https://example.com" | 跳转到 URL。 |
cli-jaw browser open "https://example.com" | navigate 的别名。 |
cli-jaw browser tabs | 列出所有已打开的标签页。 |
cli-jaw browser tabs --json | 以 JSON 格式列出标签页。 |
cli-jaw browser active-tab --json | 以 JSON 格式获取当前活动标签页信息。 |
cli-jaw browser tab-switch 2 | 按索引切换标签页。 |
cli-jaw browser reload | 刷新当前页面。 |
cli-jaw browser resize 1440 900 | 调整视口大小。 |
cli-jaw browser scroll --x 0 --y 1000 | 滚动到绝对位置。 |
cli-jaw browser wait-for-selector ".toast-success" --timeout 30000 | 等待 CSS 选择器出现。 |
cli-jaw browser wait-for-text "Dashboard" --timeout 30000 | 等待页面上出现指定文本。 |
cli-jaw browser evaluate "document.title" | 在页面上下文中执行 JavaScript。 |
evaluate 是诊断命令。请勿在更高级别的供应商工作流(如 web-ai)中通过它执行任意用户提供的 JavaScript。支持标签
| 场景 | 标签 | 说明 |
|---|---|---|
本地 cli-jaw browser 原语 | 就绪 | 仅支持服务器驱动的本地 Chrome/CDP |
doctor 和 cleanup-runtimes | 就绪 | 默认试运行;关闭需要 --force |
| 仪表盘可见/无头启动分离 | 就绪 | 可见手动模式和无头代理模式是分开的 |
| web-ai 供应商工作流 | 测试版 | 请使用 web-ai 技能和供应商特定的门控 |
| 外部托管/云 CDP | 延期 | 请勿声称支持远程浏览器托管 |
规则和约束
- Ref ID 是临时的。它们的作用域仅限于最近一次快照。在导航、刷新、切换标签页或任何页面变化后,请务必重新运行
snapshot --interactive。 - 快照优先使用
--interactive以节省 token 预算 — 完整快照包含非交互节点,数据量可能很大。 - 自动化会话请使用
--agent。它以无头模式启动,避免弹出可见浏览器窗口。 - 切勿关闭通过
ps找到的 Chrome 进程。只能使用cleanup-runtimes --close --force,它会通过持久运行时记录验证 jaw 拥有的进程。 - 执行
reset前请先询问。reset命令会清除浏览器配置文件和截图。仅在用户明确请求时使用。 evaluate仅用于诊断。请勿在更高级别的工作流中通过evaluate传递任意用户提供的 JavaScript。- 非 DOM 元素(Canvas、WebGL、跨域 iframe、自定义 UI)应在确认没有可用 ref 后,才回退到
vision-click技能。
常见工作流
网页搜索
cli-jaw browser start --agent
cli-jaw browser navigate "https://www.google.com"
cli-jaw browser snapshot --interactive
cli-jaw browser type e3 "search query" --submit
cli-jaw browser snapshot --interactive
cli-jaw browser click e7
表单填写
cli-jaw browser snapshot --interactive
cli-jaw browser type e1 "John Doe"
cli-jaw browser type e2 "john@example.com"
cli-jaw browser click e3 # 提交按钮
cli-jaw browser snapshot # 验证提交结果
读取页面内容
cli-jaw browser navigate "https://news.ycombinator.com"
cli-jaw browser text # 纯文本提取
cli-jaw browser text --format html # HTML 内容
cli-jaw browser snapshot --interactive
AI 网页工作流
对于 ChatGPT 或其他 web-ai 工作流,请使用 web-ai 技能。浏览器技能负责底层页面控制;web-ai 负责结构化问题渲染、活动标签页安全性和响应基线处理。
~해줌 示例
触发浏览器技能的自然语言请求。支持韩语和英语。
"구글 검색해줌 — CLI-JAW 설치 방법"
browser start --agent + navigate + type --submit + snapshot。"이 웹사이트 스크린샷 찍어줌" / "이 페이지 캡처해줌"
navigate + screenshot --full-page。"이 페이지에서 로그인 폰 채워줌 — ID: admin, PW: test1234"
snapshot --interactive + type + click。"탭 목록 보여줌" / "열 려있는 탭 중에 구글 탭으로 전환해줌"
tabs 列出已打开的标签页,然后使用 tab-switch 切换到匹配的标签页。多标签页管理工作流。"브라우저 상태 확인해줌" / "Chrome 안 되면 진단해줌"
browser status 和 browser doctor --json 检查 CDP 连接状态、端口所有权和孤儿运行时状态。诊断工作流。无头模式
三种运行 Chrome 无头模式的方式:
# 推荐用于自动化
cli-jaw browser start --agent
# 手动模式显式指定无头
cli-jaw browser start --headless
# 通过环境变量
CHROME_HEADLESS=1 cli-jaw browser start
所有代理自动化请使用 --agent。它避免弹出可见浏览器窗口,是自动化会话的预期默认值。
环境变量
| 变量 | 描述 |
|---|---|
CHROME_HEADLESS=1 | 为手动启动启用无头模式。 |
CHROME_NO_SANDBOX=1 | 禁用 Chrome 沙盒。仅限 Docker/CI — 请勿在普通机器上使用。 |
默认 CDP 端口从 cli-jaw 服务器端口派生。仅在需要显式覆盖时使用 cli-jaw browser start --port <port>。
独立 agbrowse 替代方案
当你明确需要驱动单个 Chrome 实例(例如,保持一个已登录的配置文件打开,避免同时运行 cli-jaw serve 和第二个 CDP 会话)时,相同的浏览器命令可通过独立的 agbrowse CLI(npm install -g agbrowse)使用。命令参数完全相同;仅二进制前缀不同。
--port 运行 cli-jaw browser 和 agbrowse — 第二个启动会复用第一个 CDP,持久化状态文件可能会冲突。运行时清理
# 诊断运行时状态
cli-jaw browser doctor --json
# 试运行:查看将被清理的内容
cli-jaw browser cleanup-runtimes
# 实际关闭 jaw 拥有的孤儿运行时
cli-jaw browser cleanup-runtimes --close --force
cleanup-runtimes 设计上是保守的。它仅作用于 jaw 拥有的 Chrome 启动时写入的持久 browser-runtime-owner.json 记录。进程命令行必须仍然匹配记录的 PID、CDP 端口和配置文件。包含 --type= 的 Chrome 辅助进程会被拒绝。切勿将通用 ps 输出作为 Chrome 进程可安全关闭的依据。
恢复策略
出现问题时,请先停下来检查状态,再执行下一步操作。
screenshot 进行视觉检查,查看页面上的实际内容。snapshot --interactive。页面变化后 Ref 会过时。wait-for-selector 或 wait-for-text 并设置适当的超时时间。status。仅在选择了该恢复路径时才执行 stop/start。reset 前先询问。vision-click 技能作为显式回退。故障排除
| 症状 | 原因 | 解决方法 |
|---|---|---|
| CDP 连接被拒绝 | Chrome 未启动或端口错误 | cli-jaw browser status,然后使用预期端口启动 |
running:false 且 owner:jaw-owned | 运行时元数据过时或 CDP 已断开 | cli-jaw browser doctor,然后重试 browser start |
| 旧的无头 jaw Chrome 仍在运行 | 持久 jaw 拥有的孤儿候选进程 | cli-jaw browser cleanup-runtimes 试运行,然后 --close --force |
| 窗口只打开测试浏览器 | Chrome 单例吸收了启动请求 | 关闭所有 Chrome 窗口,然后使用 start --agent |
| 无头 CDP 未打开 | 在无 GUI 环境中未请求无头模式 | 添加 --headless 或使用 --agent |
| 端口冲突 | 另一个进程占用了 CDP 端口 | 选择不同的 --port |
| 快照过大 | 页面节点过多 | 使用 --interactive 或 --max-nodes 限制输出 |
计划中的运行时差异
以下命令是来自 30_browser 参考设计的计划对等目标。除非在后续 PRD 中明确升级,否则它们在当前运行时中不可用。
计划中的观察和诊断命令
cli-jaw browser console --clear --reload --duration 3000
cli-jaw browser network --reload --duration 1000
cli-jaw browser wait 2000
计划中的操作命令
cli-jaw browser resize 0 0 --fullscreen
cli-jaw browser scroll down
cli-jaw browser scroll up --amount 1000
wait-for <ref> 在参考设计中已弃用,因为 ref 的作用域仅限于快照。请优先使用基于选择器或基于文本的等待。相关技能
| 技能 | 关系 |
|---|---|
desktop-control | 统一的桌面 + 浏览器自动化。将 DOM 目标路由到 CDP(浏览器技能),将桌面应用路由到 Computer Use。 |
web-ai | AI 驱动的网页工作流(如 ChatGPT)。使用浏览器原语,但增加了结构化问题渲染和响应处理。 |
vision-click | 基于视觉的点击定位。用于非 DOM 元素(Canvas、WebGL、跨域 iframe)的回退方案。 |
screen-capture | 屏幕捕获和录制。通过系统级捕获补充浏览器截图。 |
注意事项
- Ref ID 是短期有效的,应视为仅限最近一次快照的作用域。
- 在导航或重大页面变化后,请务必重新运行
snapshot --interactive。 - 优先使用
--interactive以节省 token 预算。 - 截图保存至
~/.cli-jaw/screenshots/。 start --agent应作为代理自动化的默认选择。- Canvas、WebGL、跨域 iframe 和自定义 UI 等非 DOM 元素,应仅在作为显式回退时使用
vision-click技能。