Practice App 设置
Practice App 是随本文档发布的小型网页应用。它是所有课程的自动化目标:带类型读数的仪表盘、图标鲜明的按钮、按需唤出的弹窗、可滚动的目标列表,以及一个滑块验证挑战。
配置一次,约五分钟。
为什么需要练习目标
自动化课程需要一个对每位读者、每次运行都完全一致的屏幕。真实应用无法保证——内容每天变、账号各不同、素材有版权。而 Practice App:
- 确定——所有数值固定。Gold 永远是
12480,时钟永远是09:45,目标列表永远是那十二行。你的 OCR 读数会与课程逐位一致。 - 可控——奖励弹窗只在你要求时出现(
?popup=1),这正是可选元素课程能复现的原因。 - 属于你——随文档发布。无需授权,也不会在你背后改变。
第 1 步 — 获取文件
应用由四个 HTML 文件和一个样式表组成,作为静态文件由本文档站点在 /practice-app/ 提供:
| 文件 | 界面 |
|---|---|
index.html | 登录 |
dashboard.html | 带四个读数的仪表盘 |
targets.html | 可滚动的目标列表 |
verify.html | 滑块验证挑战 |
如果你在托管站点阅读本文档,从 /practice-app/ 下载该文件夹。如果你有仓库,它位于 docs-site/static/practice-app/。
第 2 步 — 在电脑上启动服务
任何静态文件服务器都可以。用 Python(如果你的机器有本应用的工具链,它已经在了):
python -m http.server 8010 --bind 0.0.0.0 --directory path/to/practice-app
--bind 0.0.0.0 是关键:它让模拟器也能访问服务,而不只是你的电脑。
首次使用时在 Windows 防火墙放行端口(PowerShell,管理员权限):
powershell -Command "New-NetFirewallRule -DisplayName 'Practice App 8010' -Direction Inbound -LocalPort 8010 -Protocol TCP -Action Allow"
第 3 步 — 查找电脑的局域网地址
模拟器通过电脑的局域网 IP 访问它,而不是 localhost:
ipconfig
找到你所用网络适配器的 IPv4 地址——例如 192.168.1.3。(使用 MuMu 桥接网络时,模拟器在同一网段,如 192.168.1.4。)
第 4 步 — 在模拟器中打开
在模拟器浏览器中访问:
http://<你的电脑IP>:8010/dashboard.html
你应看到仪表盘:

如果页面打不开,先从模拟器内部测试连通性——通过 ADB 快速检查:
adb shell "curl -s -o /dev/null -w '%{http_code}' http://<你的电脑IP>:8010/dashboard.html"
返回 200 说明服务与防火墙没问题,剩下的问题只在你于浏览器里输入的 URL。
各个界面
仪表盘
大多数课程的主场。四个读数——每个对应一种 OCR 值类型——外加四个操作按钮和一条活动日志:

① Gold ② Energy ③ Troops ④ Next Cycle —— 每个读数对应一种 OCR 值类型。⑤ 状态栏:一个时钟和一组坐标,两者都是自定义正则的目标。
| # | 读数 | 显示 | 它教的 OCR 类型 |
|---|---|---|---|
| ① | Gold | 12480 | 数字(Number) |
| ② | Energy | 85% | 百分比(Percentage) |
| ③ | Troops | 3/5 | 计数器(Counter x/y) |
| ④ | Next Cycle | 04:20 | 时间(Time mm:ss) |
| ⑤ | 状态栏 | 09:45、X:1167 Y:1120 | 自定义正则(Custom) |
四个读数、四种不同的值类型,同处一屏——于是一个练习目标就覆盖了 Read Text 能提取的每一种内容类型。
奖励弹窗
打开 dashboard.html?popup=1,Daily Reward 对话框出现;不带参数则不出现。Claim 给 Gold 读数加 2500;Close 关闭对话框:

① 地址栏里的 ?popup=1 开关——两种状态的全部差别就在这里。② Claim 给 Gold 加 2500。③ Close 关闭而不领取。
这个开关是第 04 课的核心:一个流程必须正确处理两种状态。
Targets
十二行固定条目,每行有等级徽章(A/B/C)、名称和等宽字体读数 X:1167 Y:1120 VAL:320。列表可滚动——正是 Swipe(滑动)练习所需——读数则供 Custom 正则 OCR 使用:

① 每行的读数。一个字符串里三个数字,正是 Custom 正则 OCR 存在的理由——见第 06 课。
Verify
滑块验证:把手柄拖进虚线缺口。缺口位置固定(轨道的 62%),因此可以精确说明预期拖动距离;需要第二种情形时用 ?gap=40 移动缺口:

① 手柄,在轨道起点。② 它必须到达的虚线缺口。箭头就是你的流程要执行的滑动——缺口固定意味着拖动距离固定。
通过查询串固定数值
所有数值都可以通过查询串固定——课程用它构造精确场景:
| 参数 | 作用 | 用于 |
|---|---|---|
?popup=1 | 显示奖励弹窗 | 第 04 课 |
?gold=900 | 设置 Gold 读数 | 阈值分支 |
?energy=15% | 设置 Energy | 毕业设计低能量路径 |
?troops=5/5 | 设置 Troops 计数 | "满员"情形 |
?timer=00:10 | 设置周期计时 | 时间读取 |
?clock=21:30 | 设置状态栏时钟 | 按时段分支 |
?x=990&y=1040 | 设置坐标 | Custom 正则 |
?gap=40 | 移动滑块缺口 | 第二种验证情形 |
参数可以组合:dashboard.html?popup=1&gold=900&troops=5/5。
最佳实践
- 做课程时保持服务运行——页面消失,流程的检测会全部落空。
- 在模拟器浏览器里收藏仪表盘 URL。
- 使用固定参数构造课程要求的确切状态,而不是苦等它出现。
- 小分辨率下若浏览器工具栏遮挡页面,将浏览器全屏。
故障排查
模拟器打不开页面,但电脑可以。
服务绑定在 localhost(请绑定 0.0.0.0),或缺防火墙规则,或你在模拟器里输入了 localhost 而不是电脑 的局域网 IP。
数值与课程不一致。
URL 里残留了固定参数。打开纯净的 dashboard.html。
弹窗从不出现。
它只在 ?popup=1 时出现。这是特性,不是缺陷。
OCR 读数乱码。 确认模拟器分辨率是 配置 MuMu 里设置的 1280×720——读数是按该分辨率设计的。