首先感谢网易的各位大神,从 ATX 到 Airtest 收获颇多
在手游中,一般新手指引都是固定的强制步骤,所以我们可以用自动点击的方式直接跑完整个新手
现行方案
基于坐标(相对位置)
直接点击每个步骤对应的坐标位置,每个步骤量一下坐标
更换不同分辨率的手机,只需要计算一下,改成点击屏幕的相对位置就行了
点击坐标过程中如果遇到弹框(断线)之类的阻碍时,没办法跳过
基于图片
在当前界面搜索图片,点击改图片的中心(但是图片识别存在匹配度的问题,可能会识别的相似的图片)
更换不同分辨率的手机,每种分辨率都需要截图,工作量比较大(airtest 有提供缩放的方法,可以只截一种分辨率)
点击坐标过程中如果遇到弹框(断线)之类的阻碍时,只需要提前截图,在点击过程中增加判断
基于 UI
在当前场景内搜索 UI 对象,点击改对象的位置(要注意条件,可能搜索条件并不是唯一;搜索到的UI也有可能并没有显示在屏幕内)
更换不同分辨率的手机,不需要做其他操作
点击坐标过程中如果遇到弹框(断线)之类的阻碍时,只需要增加判断就可以了
以上三种方法,在编写测试代码的时候都需要手动跑至少一遍新手测试
坐标的话,需要测量计算
图片的话,主要的工作量在截图
UI 对象的话,只需要测需要的 UI 就可以了(可能并不需要手动跑完整个新手)
对比下来,UI 的工作量是最小的;而且以上三种方法可以结合使用
而且使用 UI 对象有个最大的优势,可以取到游戏内的文本,可以进行更复杂的逻辑操作
代码示例
学 ATX 时写的基于图片操作,完全写死的步骤
这段代码中,详细列举了新手的每一步操作,搜索图片,然后点击对应的位置
因为代码中所写的步骤都是固定的,所以面临两个问题
引导修改
如果游戏迭代过程中,对新手指引的步骤进行了修改,代码也需要同步修改
中断
如果代码执行过程中断了,继续执行的话,需要删减部分代码
如果游戏内出现阻碍新手的弹框、提示之类的,也无法进行判断
所以我们需要一个更好的办法来解决通用和中断的问题
部分资料
Python 基础:http://www.runoob.com/python3/python3-tutorial.html
Poco 文档:http://poco.readthedocs.io/zh_CN/latest/
Poco 示例:http://poco.readthedocs.io/zh_CN/latest/source/README.html#tutorials-and-examples
修改过程
接下来的过程以另一个游戏为例,使用基于 UI 的方式来执行新手指引的过程
这里需要提前集成 Poco-SDK
我们先分析下整个新手过程中的通用部分,我们主要是把整个新手拆分成不同的UI,方便我们进行不同的操作
开场战斗
角色创建
存在指引手指的指引步骤
剧情对话
各类提示框
有了大致的 UI 后,我们可以考虑直接使用循环点击指引手指指引的位置,过程中存在其它界面时,就执行对应的操作,大致结构如下:
上面的代码就不需要和最初那样,考虑新手指引的步骤;因为一直在检查当前界面显示的 UI,所以也不用考虑执行中断后重哪里继续
但是游戏过程中需要考虑到一个问题,在网络中断的时候,弹框会和指引手指或者其它界面一起出现;虽然其它 UI 会被提示框遮挡,但是 UI 还是存在于当前界面的;所以在判断的时候,需要考虑下编写的顺序
优化过程
在 Poco 的示例中有一个等待 UI 出现的方法
https://poco-chinese.readthedocs.io/zh_CN/latest/source/poco.pocofw.html#poco.pocofw.Poco.wait_for_any
在超时前返回等到的第一个 UI 代理对象,等不到 UI 时会报错
所以上面的代码可以改一下:
但是在等待过程中,一直没有找到 UI 时,会报错,我们可以在报错的时候做一些处理,比如停止循环
最终代码
最终使用 Poco 跑新手流程的完整代码
完成以上步骤后,我们已经可以运行一个完整的新手流程了
接下来可以使用命令直接运行写好的 .air 脚本
http://airtest.readthedocs.io/zh_CN/latest/README_MORE.html#run-test-case
将命令保存为不同的批处理文件后,批量打开,就可以做到最简单的多台机器同时运行了,需要注意,如果使用命令的话,需要将脚本内连接设备的代码删掉