跳到主要内容

第 04 课 · 处理可选弹窗

有的日子奖励弹窗迎接你,有的日子没有。你的流程两种情况都必须正确。

问题

真实应用总在打断你:每日奖励、促销、公告。它们时不时出现。假设弹窗总在的自动化会在它缺席的日子坏掉;假设它永不出现的会在它出现的日子坏掉。

Practice App 让这可以复现:dashboard.html?popup=1 显示奖励弹窗,纯净的 dashboard.html 不显示。一个流程,两种现实。

你将学到

  • 两个分支都是成功的分支结构。
  • 把短超时检测当作提问,而不是等待。
  • 分支汇合,让真正的工作只存在一份。
  • 按需制造两种测试状态。

开始之前

  • 完成第 03 课——本课复用它的模板截取技能。

流程

编辑器中的第 04 课流程

徽标按阅读顺序给节点编号,与动手构建步骤对应。注意形状:检测在此分叉,有弹窗的那条分支先关闭再沉降,两条路径最后汇回同一个后续节点——一个流程,两种状态。

注意形状:一个会汇合的岔路。真正的工作(3. Carry on)只有一份——两条分支都汇入它。

动手构建

  1. 新建流程。添加 Find Image,命名 1. Is the reward popup showing?,模板是弹窗的星形图标(在 ?popup=1 时截取)。Timeout 2000 ms——刻意地短。
  2. 添加 Click,命名 2a. Close it,区域画在弹窗的 Close 按钮上。
  3. 添加 Wait,命名 3a. Let it close600 ms,理由 close animation
  4. 添加 Click,命名 3. Carry on with the real work,区域在 Collect 按钮上。
  5. 一个 Stop:success,消息 Handled both states
  6. 连线:提问的 Success → Close → Wait → Carry on;提问的 Failure → 直接 Carry on。Carry on → Stop。
  7. Save,Auto Layout。

为什么用这些节点

节点角色备注
Find Image(2000 ms)问"它现在在吗?"短超时:你不是在等它到来
Click Close + Wait只在有弹窗时走的绕行等待防止下一次点击读到关闭中的帧
Click Collect真正的工作只存在一份,在汇合之后
一个 Stop两条路同样收尾因为两条路同样正确

超时就是设计决策。 第 03 课的超时意为"给它时间出现"。这里意为"看一眼,很快"。此节点若配 30 秒超时,每个无弹窗的日子都要白等 30 秒——流程照样正确,每天照样浪费半分钟。超时编码了意图。

分支命名惯例

2a / 3a 的编号标记绕行路径;纯数字标记主路径。在 20 个节点的画布上,这个惯例让读者只凭名字就能还原结构。

运行

测试两种现实:

  • 有弹窗——打开 dashboard.html?popup=1,运行:命中(~300 ms)→ Close → 等待 → Collect → success
  • 无弹窗——打开纯净 dashboard.html,运行:轮询 2 秒、无命中 → 直接 Collect → success

同一流程,同一结局,不同路线。看运行日志:从执行了哪些节点就能看出每次走了哪条路。

最佳实践

  • 可选元素用短超时——1500–2500 ms。你在提问,不是等待。
  • 汇合分支。 在两条分支上复制"真正的工作"是通往维护灾难的经典之路——你会改了一份忘另一份。
  • 关闭后要等待。 下一个操作不能和关闭动画赛跑。
  • 刻意测试两种状态。 ?popup=1 开关的存在,正是为了你不必守株待兔地测试罕见路径。

常见错误

错误后果修复
弹窗检查用长超时每个无弹窗运行都浪费那么久2000 ms 绰绰有余
每条分支各复制一份真工作两份副本渐行渐远汇合到一个节点
Close 后不等待下一点击落在半关的遮罩上保留 600 ms Wait
把"无弹窗"当失败日志里全是假警报两种结局都是 success

故障排查

弹窗在,检查却漏掉它。 模板多半把变暗的背景截进去了。只重截星形图标。

点了 Close,下一次点击还是打在遮罩上。 把等待提到 800–1000 ms。

带着 ?popup=1 却总走"无弹窗"分支。 你在不同缩放下截的模板,或浏览器工具栏挤动了布局——在你实际运行的同一屏幕上重截。

小结

  • 可选元素是一个分支,不是错误:短检查、绕行关闭、汇合。
  • 超时长度编码检测的含义——等待还是提问。
  • 汇合的分支让真正的工作只在一处。

下一课

至今每个决定都来自是否看见某物第 05 课 · 读取一个数字开始根据屏幕说了什么做决定——你的第一次 OCR。

另见:Find Image · If — Node outcome 模式(在流程后段对本检查再分支)