我在做一个很具体的小项目:在 Mac 上控制 iPhone 镜像,让电脑替我完成一个 App 里的每日任务——签到、开宝箱、看广告领金币这类每天都要重复一遍的操作。
先说清楚边界。不破解接口,不模拟观看,广告还是我真人看,电脑只负责导航、等待和点击;手机上不装任何东西,全程操作的是 macOS 里的镜像窗口。这类任务的特点是机械、重复、几乎没有判断难度,所以适合交给程序。
听起来就是四步:截图、OCR、找到按钮、点下去。真正跑起来才发现,最常发生的不是“点不到”,而是“点了,日志说成功,奖励没到账”。
举两个真实例子。一次点宝箱,点击返回成功,页面却停在原地,后来发现是点击落在了弹窗背后。还有一次,镜像窗口从横坐标 1060 自己跑到了 -485,程序按旧坐标点下去,点到了完全无关的位置。这两个问题都和 OCR 无关——文字识别得再准,也拦不住这种“假成功”。
所以这篇文章不谈怎么识别按钮,谈的是识别之后最容易翻车的地方:怎么确认一次点击真的完成了任务。
分清三层成功
自动化里的“成功”至少有三层:
- 输入成功:系统接受了一次点击、滑动或按键。
- 页面成功:目标页面发生了预期变化,比如弹窗关闭、按钮变灰或进入下一页。
- 业务成功:任务真的完成,比如奖励到账、状态更新或记录生成。
最常见的事故,是只验证了第一层。
点击接口返回成功,只能说明系统收到了一次输入。按钮可能被遮挡,点击可能落到弹窗背后,页面也可能停在加载中。即使页面变了,也不代表业务完成:有时成功提示只是过渡动画,有时同一个“领取”入口背后既有直接到账的任务,也有要求先看完广告的任务。
因此,可靠系统不能只记“我点了”,还要回答:点的是哪个对象,当时处于哪个页面阶段,点完应该看到什么结果。
后台能看,不等于能点
iPhone 镜像有个好处:Mac 可以在后台截图。用系统的屏幕捕获接口锁定镜像窗口,不要求它获得焦点,我写代码的同时它照常识别页面,几十行文字一秒左右就能认完,鼠标也不会被抢走。
但输入做不到后台。直接给后台窗口发送点击事件并不稳定;让自动化工具操作一个已经打开、但不在前台的镜像窗口,也会直接报“找不到可操作窗口”。这些结果只否定了两条具体路径,不代表所有后台输入都不可行,却足以说明:能看见和能操作是两种能力。
最后定成一条折中规则:观察永远留在后台,点击时把镜像短暂切到前台,点完立刻把原来的应用切回来。每次只做一个动作,做完马上恢复。如果恢复失败就停止,不自动重试——因为那次点击可能已经发生,重试会把一次错误放大成两次。
点击之前先验窗口
很多自动化教程把按钮写成“屏幕宽度的 30%、高度的 70%”。固定窗口里可以用,真实桌面里很脆:窗口会移动、缩放、换屏幕,甚至看起来还在,实际已经变成了另一个对象。
那次从 1060 漂到 -485 之后,我把动作前的检查固定成了清单:
- 重新读取目标窗口的编号、位置和大小;
- 重新截图,确认画面不是全黑、空白或异常缩放;
- 确认页面仍处于预期阶段;
- 确认目标控件唯一匹配,而不是只出现了一个相似词语;
- 写下点击后应该出现什么业务回执。
坐标只是最后一步。之前必须先确认“这是哪个窗口、哪一页、哪个对象”。
看回执,不看按钮反应
福利页里同时有签到、宝箱、金币罐、观看任务、邀请、支付、下载、购物、会员、提现十几种入口,文字相邻、按钮复用,只靠“看到某个词就点”很容易把弹窗背后的按钮当成当前目标。
所以我把流程拆成了有限状态:先确认在主页,再进入福利页;先处理可以直接领取的任务,再处理需要看广告的;完成一次后,等待明确的回执,再重新判断。规则只返回动作建议和期望回执,真正执行点击、限次、写日志的是统一的执行器。
模型在这个结构里只当救火队员:规则不认识的页面才交给视觉模型,它只能关闭普通弹窗,不能替我领取奖励、打开广告、下载应用、支付或修改权限。稳定路径交给代码,系统才解释得清每一次动作。
关键动作之后,验收靠的是业务回执,不是按钮有没有响应:
- 宝箱领取后,要出现“已领取”状态或明确的到账提示;
- 广告看完后,要回到任务页并显示对应任务完成;
- 签到之后,按钮要变灰或状态变化,而不是只闪过一个提示。
看不到回执时,结果记为“未知”,不自动重试。日志围绕这条验收线设计:记录动作意图、目标身份、页面阶段、期望回执、实际回执和终止原因,不记录完整屏幕文字或账户余额。
停不下来才是事故
一个能用的自动化系统,必须有明确的停止条件:窗口移动或身份无法确认、同一页面出现多个相似目标、点击后没有业务回执、恢复原应用失败、连续多轮没有进展,或者进入支付、登录、权限这类不可逆操作。
在这个项目里,每轮默认最多 12 次动作,每天最多 40 次;连续失败会逐步拉长等待时间,跨日后停止上一轮状态。这些限制不是功能不足,而是为了在判断出错时控制影响范围——自动化最怕的不是停,而是错了还在继续。
现在跑到哪了
后台识别、前台点击、焦点恢复、宝箱二选一、连续广告、金币到账弹窗,这些单点都有实机证据。但整条“打开 App,领完全部任务”的链路还没有稳定跑通一次:页面组合一直在变,同样叫“领取”的任务有不同条件,广告关闭按钮偶尔漏识别,完成回执会短暂经过福利页。
所以如果哪天我晒“全自动领取”的截图,你应该先问三个问题:它怎么确认窗口没变?它怎么确认奖励真的到账?失败时它会停吗?
点击成功只是开始。可信的自动化,要一路证明到结果。
COMMENTS
读者评论