第09章 - 交互式动作与运行时变量注入
纯自动化的流程有时并不够用——总有一些环节需要人来决策:输入短信验证码、确认关键操作是否继续、在流程节点收到提醒。robotgo-flow 通过交互式动作在自动化流程中嵌入「人工节点」,让「自动」与「人工」协同。本章讲解 prompt、confirm、notify 三种交互式动作,以及贯穿全书的运行时变量注入机制。
9.1 交互式动作概览
robotgo-flow 提供三种交互式动作:
| 动作 | 作用 | 是否阻塞 |
|---|---|---|
prompt |
运行时弹出输入框,让用户输入内容 | 是,等待用户输入 |
confirm |
弹出确认对话框,让用户决定是否继续 | 是,等待用户确认 |
notify |
弹出系统通知,告知用户某事 | 否,不阻塞 |
它们的共同价值在于:把「人的判断」嵌入到自动化流程的精确位置。
9.2 prompt:运行时输入
prompt 在流程执行到某一步时弹出输入框,让用户输入内容。与 inputs(执行前统一输入)不同,prompt 是执行过程中按需输入,最典型的场景是动态验证码:
- prompt:
title: "请输入验证码"
message: "验证码已发送至手机"
into: "templates/input_code.png" # 可选:输入前先点击此模板
mask: false # 是否隐藏输入
对应源码中的 PromptSpec 结构,字段含义:
| 字段 | 说明 |
|---|---|
title |
输入框标题(必填) |
message |
提示信息(必填) |
into |
可选,输入前先点击并定位到的目标模板(输入框) |
mask |
可选,是否隐藏输入内容(密码/敏感信息) |
9.2.1 prompt 的执行逻辑
interact.go 中 PromptAction.Execute 的流程:
- 调用
notify.InputBoxStd(title, message, mask)弹出输入框,等待用户输入; - 若指定了
into:FindElement(into)定位目标输入框 → 点击聚焦 → 把用户输入的值TypeText进去; - 若用户取消(输入为空),返回错误(会按错误策略处理)。
也就是说,prompt 不仅收集用户输入,还能自动把输入填进指定的界面输入框——这对验证码场景特别方便:用户只需在框里敲验证码,框架就替他填进网页。
9.2.2 验证码场景示例
steps:
- name: "触发验证码"
actions:
- click: "templates/btn_send_code.png"
- wait: "templates/code_input.png"
- name: "人工输入验证码"
actions:
- prompt:
title: "输入验证码"
message: "请查看手机短信并输入 6 位验证码"
into: "templates/code_input.png"
- click: "templates/btn_verify.png"
9.3 confirm:确认对话框
confirm 弹出一个「是/否」确认框,让用户决定流程是否继续:
- confirm:
title: "确认操作"
message: "数据已填写完毕,是否提交?"
对应 ConfirmSpec 结构,title 与 message 均为必填。执行逻辑:调用 notify.ConfirmBoxStd(title, message),若用户选择「否」,返回错误(默认策略下会终止流程)。
confirm 常用于不可逆或高风险操作前的最后一道人工闸门:
steps:
- name: "填写完成待确认"
actions:
- confirm:
title: "提交确认"
message: "即将提交订单,确认无误?"
- click: "templates/btn_submit.png"
- wait: "templates/submit_success.png"
这样,自动化把繁琐的填写都做完,最后由人拍板是否提交,兼顾了效率与安全。
9.4 notify:系统通知
notify 弹出一个系统通知(不阻塞流程):
- notify:
title: "提醒"
message: "处理已完成"
duration: 3 # 秒,>0 时自动消失;=0 时需手动关闭
对应 NotifySpec 结构,字段:
| 字段 | 说明 |
|---|---|
title |
通知标题 |
message |
通知内容 |
duration |
显示时长(秒),>0 自动消失,=0 需手动关闭 |
notify 是非阻塞的——弹出通知后流程立即继续,NotifyAction.Execute 总是返回成功。它适合在关键节点给用户「打个招呼」,例如流程开始、阶段完成、需要关注等:
steps:
- name: "开始处理"
actions:
- notify: {title: "自动化", message: "开始处理批量任务", duration: 3}
# ... 一系列操作 ...
- name: "处理完毕"
actions:
- notify: {title: "自动化", message: "全部任务已完成!", duration: 0}
9.5 运行时变量注入机制
交互式动作解决的是「执行中的人工输入」,而运行时变量解决的是「执行前的参数化」。二者相辅相成,共同让工作流具备灵活性。
9.5.1 定义与引用
运行时变量在顶层 inputs 中定义(详见第 4 章),在动作中用 $input.<变量名> 引用:
inputs:
- name: username
label: "用户名"
required: true
- name: password
label: "密码"
required: true
mask: true
- name: comment
label: "备注"
placeholder: "可选填写"
steps:
- name: "填写"
actions:
- type: {into: "templates/input.png", text: "$input.username"}
9.5.2 可注入的位置
框架的 ResolveInputs 会在以下位置替换 $input.<name>:
type的text与into;open_url的 URL;prompt的title、message、into;confirm的title、message;notify的title、message。
例如可以把变量拼进 URL:
- open_url: "https://example.com/user/$input.username/profile"
9.5.3 替换的实现细节
ResolveInputs 使用 strings.NewReplacer 一次性替换,并且把变量名按长度从长到短排序后再构造替换器。这样做是为了避免「短变量名是长变量名前缀」时的误替换——例如同时存在 user 和 username 时,先替换 username 才不会把 $input.username 错误地当成 $input.user + name。
9.5.4 inputs 与 prompt 的区别
| 对比项 | inputs + $input |
prompt |
|---|---|---|
| 输入时机 | 执行前统一输入 | 执行中按需输入 |
| 适用场景 | 已知的参数(账号、关键词) | 动态生成的内容(验证码) |
| 复用位置 | 可在多处引用同一变量 | 单次输入,可自动填入指定框 |
一个工作流可以同时使用两者:执行前用 inputs 收集账号密码,执行中用 prompt 收集验证码。
9.6 综合示例:带人工介入的登录
把交互式动作与运行时变量结合,实现一个「参数化 + 人工验证码 + 提交确认」的完整登录流程:
name: "安全登录流程"
inputs:
- name: account
label: "账号"
required: true
- name: pwd
label: "密码"
required: true
mask: true
settings:
element_timeout: 15
on_error: abort
steps:
- name: "打开并填写"
actions:
- open_url: "https://example.com/login"
- wait: "templates/login_form.png"
- type: {into: "templates/input_account.png", text: "$input.account"}
- type: {into: "templates/input_pwd.png", text: "$input.pwd"}
- name: "人工验证码"
actions:
- click: "templates/btn_send_code.png"
- prompt:
title: "输入验证码"
message: "请输入手机收到的验证码"
into: "templates/input_code.png"
- name: "确认并提交"
actions:
- confirm:
title: "确认登录"
message: "信息已填写完毕,确认登录?"
- click: "templates/btn_login.png"
- wait: "templates/home.png"
- notify: {title: "完成", message: "登录成功", duration: 3}
9.7 小结
本章我们讲解了三种交互式动作与运行时变量注入机制:prompt 在执行中弹出输入框、可自动填入指定输入框(验证码场景利器);confirm 在高风险操作前作为人工闸门;notify 非阻塞地推送系统通知。运行时变量 $input.<name> 支持在 type、open_url、交互式动作等多处注入,替换时按变量名长度排序以避免前缀冲突。我们还厘清了 inputs(执行前)与 prompt(执行中)的分工。至此,19 种动作全部讲解完毕。下一章,我们深入框架的核心机制之一——图像模板匹配。