跳到主要内容

第 05 课 · 读取一个数字

至今屏幕只回答是/否。现在它开始回答多少

问题

仪表盘显示 Gold: 12480。请判断:它是否超过 10,000——并据此路由流程。

这需要三种新能力:读取屏幕上的文字,把它读成数字而不是字符,以及按条件分支而不是按检测分支。

你将学到

  • 你的第一个 Read Text (OCR)(读取文本)节点,以及为什么 What to read 类型比其他任何设置都重要。
  • 把读取结果存入变量
  • 你的第一个 If 节点(Expression 模式)。
  • 为什么读不出的值应当留空,而绝不变成假的 0

开始之前

  • 完成第 04 课
  • 流程的 OCR 功能开关已开:flow settings → Features → ocrEnabled。OCR 关闭的流程里 Read Text 节点会立刻失败——这是初学 OCR 最常见的绊脚石。

流程

编辑器中的第 05 课流程

徽标按阅读顺序给节点编号,与动手构建步骤对应。OCR 节点有两个出口,它下面的 If 又有两个,所以一次读取会产生三个彼此分明的结局——读不出、够、不够。

动手构建

  1. 新建流程。在流程的 Variables 对话框声明 gold,类型 number?(可空——? 的含义见下文)。
  2. 添加 Read Text (OCR),命名 1. Read the Gold readout
    • Region:在 Live Preview 上紧贴白色 Gold 读数框绘制。
    • What to read: Number——不是 Auto。
    • 输出变量:gold。Timeout 5000 ms。
  3. 添加 If,命名 2. Is Gold above 10000?,条件类型 Expression{{gold}} > 10000
  4. 三个 Stop:enough gold(success)/ not enough(success)/ unreadablefailure)。
  5. 连线:Read Success → If,Read Failure → unreadable;If True → enough,False → not enough。
  6. 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 是 12480success · 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 · 变量与记忆