airtest无法长期挂机,因其缺乏后台运行、异常恢复和资源监控能力;必须由python补足调度、容错与状态管理,将airtest仅作为截图→匹配→点击的执行单元。

Airtest 本身不支持“长期挂机”——它没有后台运行、异常恢复、资源监控等能力,直接写个循环 touch() 几小时大概率会因界面变化、弹窗、卡顿或内存溢出而中断。真要跑日常任务,必须用 Airtest 做“单步操作”,再用 Python 补足调度、容错和状态管理。
为什么不能只靠 Airtest 脚本循环执行?
Airtest 的 airtest.core.api.touch()、exists() 等函数依赖实时截图比对,一旦游戏切后台、锁屏、弹出系统通知(如微信来电)、画面加载延迟或分辨率偏移,exists() 就会返回 False,后续操作全部错位。更关键的是,Airtest 没有超时重试机制、无异常后退逻辑、也不记录操作历史——一次识别失败,整个流程就卡死。
常见错误现象包括:
-
TargetNotFoundError:图标没找到,脚本直接抛异常退出 - 点击位置漂移:游戏 UI 动态缩放或适配不同机型时,
Template坐标失效 - 误触其他按钮:比如在“副本结算页”没判断清楚就点“继续”,结果跳回主城
用 Python 控制 Airtest 的最小可行结构
核心是把 Airtest 当作“执行单元”,所有判断、等待、重试、状态跳转都由 Python 主逻辑控制。Airtest 脚本只做三件事:截图 → 匹配 → 点击/滑动,其余全交给 Python。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
实操建议:
- 每个操作封装成带返回值的函数,例如
def click_start_fight(): return exists(Template("tpl1712345678.png")) and touch(Template("tpl1712345678.png")) - 用
time.sleep()配合exists()轮询等待关键界面,避免空转;例如等战斗结束,不要sleep(60),而是while not exists(Template("battle_end.png")): sleep(2) - 关键节点加状态检查:进副本前先
exists(main_city_icon),失败则调用back_to_main()(自己实现返回主页的点击序列) - 捕获
TargetNotFoundError,并统一 fallback 到重试或重启流程
绕过识别失败的几个硬招
纯图像识别在游戏里太脆弱。得组合其他手段降低依赖:
- 用
get_screenpos()+ 固定坐标偏移代替部分图标匹配(例如“跳过动画”按钮总在右上角 50px 内,可直接touch((width-80, 60))) - 对动态内容(如体力值),改用 OCR:调用
airtest.ocr.ocr()提取数字,再判断是否 >0 - 关键步骤加“双保险”:例如点击“开始任务”后,立刻
exists("task_in_progress.png"),若 5 秒内未出现,则视为点击失败,重新点一次 - 避免跨场景模板复用:
"confirm_btn.png"在登录页和战斗页长得一样,但语义不同——必须用不同路径或加上下文判断(如先exists("fight_scene.png")再点确认)
实际运行时最常被忽略的细节
很多人本地调试通过就扔服务器上跑,结果一小时后全崩——问题往往不在代码逻辑,而在环境:
- Android 设备必须保持「不休眠」+「USB 调试常开」+「关闭 USB 安装权限弹窗」(用
adb shell settings put global adb_enabled 1持久化) - Airtest 连接用的是
Android()实例,每次初始化都要检查设备是否在线:if not dev.exists: dev.connect(),否则touch()会静默失败 - 截图尺寸和游戏渲染帧率强相关:部分游戏在后台会降帧甚至停渲染,导致
snapshot()拿到的是黑屏或旧帧——必须确保前台活跃,可用adb shell input keyevent KEYCODE_WAKEUP唤醒屏幕 - Python 进程不能被系统杀掉:安卓上要用 Termux +
nohup python main.py &;Windows 上别用 CMD 直接双击,要用pythonw.exe后台运行
真正稳定的挂机不是“写完就能跑”,而是每一步操作都预设了它失败的样子,并留好退路。图像识别只是触发器,Python 才是那个盯着表、看日志、按重试键的人。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










