第 05 课 · 读取一个数字
至今屏幕只回答是/否。现在它开始回答多少。
问题
仪表盘显示 Gold: 12480。请判断:它是否超过 10,000——并据此路由流程。
这需要三种新能力:读取屏幕上的文字,把它读成数字而不是字符,以及按条件分支而不是按检测分支。
你将学到
- 你的第一个 Read Text (OCR)(读取文本)节点,以及为什么 What to read 类型比其他任何设置都重要。
- 把读取结果存入变量。
- 你的第一个 If 节点(Expression 模式)。
- 为什么读不出的值应当留空,而绝不变成假的
0。
开始之前
- 完成第 04 课。
- 流程的 OCR 功能开关已开:flow settings → Features →
ocrEnabled。OCR 关闭的流程里 Read Text 节点会立刻失败——这是初学 OCR 最常见的绊脚石。
流程

徽标按阅读顺序给节点编号,与动手构建步骤对应。OCR 节点有两个出口,它下面的 If 又有两个,所以一次读取会产生三个彼此分明的结局——读不出、够、不够。
动手构建
- 新建流程。在流程的 Variables 对话框声明
gold,类型 number?(可空——?的含义见下文)。 - 添加 Read Text (OCR),命名
1. Read the Gold readout:- Region:在 Live Preview 上紧贴白色 Gold 读数框绘制。
- What to read: Number——不是 Auto。
- 输出变量:
gold。Timeout5000ms。
- 添加 If,命名
2. Is Gold above 10000?,条件类型 Expression:{{gold}} > 10000。 - 三个 Stop:
enough gold(success)/not enough(success)/unreadable(failure)。 - 连线:Read Success → If,Read Failure → unreadable;If True → enough,False → not enough。
- Save,Auto Layout。
为什么这些节点——以及两条关键规则
| 节点 | 角色 | 传递 |
|---|---|---|
| Read Text | 对区域 OCR,按类型解析 | vars.gold 是一个数字 |
| If | 在上下文中求值表达式 | 它的路由:True / False |
| 三个 Stop | 每个真正不同的结局一个 | 最终状态 + 消息 |
规则一——类型承担了全部重活。 选 What to read: Number,引擎为数字自我调优并交付 12480 这个数字。选 Auto 你得到字符串 "12480"——而 {{gold}} > 10000 拿字符串比较会安静地出错。选对类型,抵得上一堆手工清洗。
规则二——读不出就留空。 OCR 解析不出数字时 gold 留空;产品从不捏造 0。捏造的零会悄悄流进比较、走错分支;空值则显式地失败。这也是声明 number? 的原因——? 允许空。若声明为纯 number,一次解析失败会以类型错误拒绝启动运行。
为什么三个 Stop,为什么 unreadable 是 failure:"高于阈值"与"低于阈值"都是你问题的正确答案——success。"我读不了屏幕"完全是另一回事:流程在自己的本职上失败了。下游(队列、计划 、父流程)会区别对待这两种状态,所以诚实申报不只是美观问题。
运行
- 纯净仪表盘:Gold 是
12480→success · Gold above threshold。 - 打开
dashboard.html?gold=900运行:→success · Gold below threshold。 - 导航离开 Practice App 再运行:无物可读 →
failure · unreadable。
三次运行、三种结局,全部是刻意设计。先对 Read Text 用 Test Node——它在你运行任何东西之前就显示原始 OCR 与解析后的值。
最佳实践
- OCR 区域贴紧。 周边 UI 是误读的头号原因。
- 知道区域内容时永远选具体类型,不用 Auto。
- OCR 变量声明为可空(
number?、string?)。 - 连上 Read Text 的 Failure——读不出来是值得上报的事实,不是要藏起来的。
- 先 Test Node 再 Test Flow。 先独立验证读取,再验证逻辑。
常见错误
| 错误 | 后果 | 修复 |
|---|---|---|
| 类型留在 Auto | > 比较字符串;走错分支 | 设为 Number |
声明为不可空的 number | 读不出的运行被 TYPE_MISMATCH 拒绝 | 声明 number? |
| 区域带上 "GOLD" 标签 | OCR 把字母混进数字 | 收窄到白色读数框 |
| 期望区域为空时走 Failure | 空读取是 Success + 空值 | 按值分支(If → Is Empty) |
| OCR 开关没开 | 节点立即失败 | Flow settings → Features → ocrEnabled |
故障排查
gold 总是空。
Test Node 显示 OCR 看到了什么。通常是区域偏了几个像素或带上了标签。重画。
If 走了 Fatal。
表达式不是布尔值——检查是否把 {{gold}} 单独当条件(数字不是条件),或变量名拼错。
你机器上读得准,朋友机器上读不准。 模拟器分辨率不同。区域按百分比存储,但字号仍影响 OCR——确认两台机器都是 1280×720。
小结
- Read Text 把像素变成带类型的值;What to read 是最重要的设置。
- If 对变量求值表达式;它的两个端口都必须连。
- 空胜过捏造:读不出的值留空,可空声明使之合法。
下一课
一个读数 搞定,还有三个。第 06 课 · 读取所有值类型在单个节点里读完仪表盘全部四个读数——数字、百分比、计数器、时间——只用一张截图。
另见:Read Text (OCR) · If · 变量与记忆