核心用法 / Core Usage

等待与断言

Agent 翻车,更多是败在乱等,而不是选错元素。 点完、填完之后,页面还在动——这时候该等什么、怎么确认动作真的生效, 决定了你的脚本是稳还是脆。这一页讲清楚 wait 怎么等、 expect 怎么断言、--observe 怎么看变化, 以及 --if-present 怎么让可选步骤保持幂等。

选对等待条件 — wait

每次会改变页面的动作之后,都要挑一个具体的条件去等, 而不是拍脑袋 sleep 一个固定毫秒数。wait 支持这些形式:

bash
$ chrome-use wait @e1                     # 直到某个元素出现
$ chrome-use wait 2000                    # 傻等,毫秒(最后手段)
$ chrome-use wait --text "Success"        # 直到页面上出现这段文字
$ chrome-use wait --url "**/dashboard"    # 直到 URL 匹配模式(glob)
$ chrome-use wait --load networkidle       # 直到网络空闲(导航后收尾)
$ chrome-use wait --load domcontentloaded  # 直到 DOMContentLoaded
$ chrome-use wait --fn "window.myApp.ready === true"  # 直到 JS 条件成立

任何会改变页面的动作之后,从下面三种里挑一个:

⚠️ 少用裸 wait 2000
除了调试,别用固定毫秒的 wait 2000——它让脚本又慢又脆。 超时默认 25 秒,所以等一个真实条件不会白等太久,但会在条件满足的那一刻就继续。

确认动作生效 — expect

动作做完之后,用断言去确认结果,而不是拉一张快照用眼睛看expect 是一个带退出码的 pass/fail 动词 (0 通过 / 1 为假 / 2 无法判断),所以它能和 &&chrome-use batch 组合,而且只花 ~1 行、不用你去读一整张快照。

bash — expect 断言
$ chrome-use click @e8 && chrome-use expect "#toast" visible      # toast 弹出来了吗?
$ chrome-use expect count ".result" ">=" 1                        # 结果加载出来了吗?
$ chrome-use expect text @e3 contains "Saved"                    # 成功提示?
$ chrome-use expect url contains /dashboard                       # 导航落地了吗?
$ chrome-use expect "#spinner" gone                               # 加载完成了?
$ chrome-use requests --clear && chrome-use click @save \
    && chrome-use expect request /api/save --status 2xx           # POST 发出且 2xx?
$ chrome-use expect no-errors                                     # 没有 console 报错?

expect 自带等待

expect 会在超时时间内轮询、等条件成立, 所以你常常不需要再单独写一个 wait。支持的条件有:

--not 反转判断,--no-wait 只检查一次不轮询。

ℹ️ 请求与控制台的前置条件
expect request 只能看到开始跟踪之后捕获的请求—— 先跑一次 requests --clearno-errors 需要控制台捕获—— 先跑一次 console。详见 排查问题

看清动作改了什么 — --observe

给一个会改变页面的动作(click / fill / type / select / check / press / eval) 加上 --observe,就不用你手动跑「动作 → wait → snapshot → diff」那一套了: 返回结果里会带一个 observed 增量——新增/移除的可交互行 (新的 toast、校验提示也会通过 alert 面通道带上)、URL 变化、发出的请求; 什么都没动就返回 {changed:false}

bash
$ chrome-use click @e8 --observe   # 一条 ~20-80 token 的回复里就看到弹出的对话框/toast/新行
✅ expect 还是 --observe?
想要一个硬性 pass/fail 门禁(配合退出码、&&、批处理)用 expect;想看清到底发生了什么、拿到结构化的变化用 --observe

一次填完整张表单 — form fill --map

与其写 N 步 fill / select / check, 不如传一个 {标签或选择器: 值} 的映射:它按 <label>、 aria-label、placeholder、name、CSS 逐个解析字段,自动派发到对应的控件类型 (字符串 → 文本/下拉/单选,true/false → 复选框), 还能顺手提交(--submit "<文本|选择器>"),返回 {filled, submitted, errors}——errors 就是行内校验消息, 所以一次提交被拒会在同一次调用里告诉你为什么。

bash — form fill --map
$ chrome-use form fill --map \
    '{"Email":"a@b.com","Country":"US","Subscribe":true}' \
    --submit "Sign up"
ℹ️ 富文本编辑器例外
DraftJS / Monaco / CodeMirror 这类富文本编辑器,用 fill 单独填——它能处理; form fill 覆盖的是标准控件。更多输入细节见 交互操作

可选步骤 — --if-present

给任意基于选择器的动作加上 --if-present(别名 --optional), 当目标不存在时它就变成一个空操作但成功↷ skipped,退出码 0), 而不是报错——不用事先读一遍页面判断,流程也能反复重跑。

bash
$ chrome-use click ".cookie-accept" --if-present   # 关掉可能不存在的 cookie 横幅
$ chrome-use check "#opt-in" --if-present
⚠️ 只跳过「元素不存在」
--if-present 只对「目标缺失」放行;真正的失败(比如元素在但点不动) 仍然会报错,不会被悄悄吞掉。

下一步