本人测试岗位,在项目不是很忙的时候,还是想写一个可以自动跑的游戏脚本。挂着游戏能够代替一些手动的测试,并且闲时晚上下班的时候挂着手机,第二天再来看报告日志,算是物尽其用了。前期脚本基础功能是要在编辑器上调试,后期会连接手机进行调试,与电脑上调试区别不大,主要是一些坐标的调整或者图标分辨不准确的区别处理,写文记录并分享下思路流程。

需求:全自动进行游戏(自己想的)

一、分解项目功能

第一步大概区分下游戏中的功能模块,但是有一些模块中的子模块也很复杂,如联盟功能,里面还有一些活动或者玩法比较复杂的小功能在里面,后面再详细区分,先把大概的模块框架确定下来。

(方法和内容可以慢慢补充)

分好类了,可以创建AirTest的项目了

1.创建项目根目录

2.再创建按上面类区分出来的目录

3.最后项目层级

二、模拟下自动游戏的操作流程

大概模拟下需要操作的动作和流程

三、脚本编写

在脚本编写前,需要模拟下新手引导的操作流程,比如判断那个图片存在时,需要点击某个位置,或者在播放动画时,需要等待几秒钟。其实新手指引很简单和单一的操作,就是出来一个步骤,点击一下,等待下一个步骤出来后,再进行点击一下。实现的话包括一些后面可能用的基础方法,提前封装一下,目前功能比较单一,后续会考虑在弱网或者断开网络的情况下增加突发的响应功能。

AirTestForSLG类用来控制整体的方法实现,主调用类

AirTestForSLG.py

# -*- encoding=utf8 -*-
__author__ = "GH"from airtest.core.api import *
from airtest.cli.parser import cli_setupif not cli_setup():auto_setup(__file__, logdir=True, devices=["Windows:///722224",], project_root="E:/AirTestForSLG")import sys#路径字符
path1 = 'E:\\AirTestForSLG\\AndroidConsoleSys.air'
path2 = 'E:\\AirTestForSLG\\BasicsConsoleSys.air'
path3 = 'E:\\AirTestForSLG\\NoviceGuideSys.air'
path4 = 'E:\\AirTestForSLG\\HeroSys.air'
path5 = 'E:\\AirTestForSLG\\BagSys.air'
path6 = 'E:\\AirTestForSLG\\MailSys.air'
path7 = 'E:\\AirTestForSLG\\LeagueSys.air'
path8 = 'E:\\AirTestForSLG\\ChatSys.air'
path9 = 'E:\\AirTestForSLG\\TaskSys.air'
path10 = 'E:\\AirTestForSLG\\SkillSys.air'
path11 = 'E:\\AirTestForSLG\\InformationSys.air'
path12 = 'E:\\AirTestForSLG\\ActivitySys.air'
path13 = 'E:\\AirTestForSLG\\GiftSys.air'
path14 = 'E:\\AirTestForSLG\\BuildingSys.air'
path15 = 'E:\\AirTestForSLG\\WorldMapSys.air'#同根路径
sys.path.append(path1)
sys.path.append(path2)
sys.path.append(path3)
sys.path.append(path4)
sys.path.append(path5)
sys.path.append(path6)
sys.path.append(path7)
sys.path.append(path8)
sys.path.append(path9)
sys.path.append(path10)
sys.path.append(path11)
sys.path.append(path12)
sys.path.append(path13)
sys.path.append(path14)
sys.path.append(path15)#py文件名字
import AndroidConsoleSys
import BasicsConsoleSys
import NoviceGuideSys
import HeroSys
import BagSys
import MailSys
import LeagueSys
import ChatSys
import TaskSys
import SkillSys
import InformationSys
import ActivitySys
import GiftSys
import BuildingSys
import WorldMapSys#加载实例,文件名+类名
androidConsole = AndroidConsoleSys.AndroidConsoleSys()
basicsConsoleSys = BasicsConsoleSys.BasicsConsoleSys()
noviceGuideSys = NoviceGuideSys.NoviceGuideSys()
heroSys = HeroSys.HeroSys()
bagSys = BagSys.BagSys()
mailSys = MailSys.MailSys()
leagueSys = LeagueSys.LeagueSys()
chatSys = ChatSys.ChatSys()
taskSys = TaskSys.TaskSys()
skillSys = SkillSys.SkillSys()
informationSys = InformationSys.InformationSys()
activitySys = ActivitySys.ActivitySys()
giftSys = GiftSys.GiftSys()
buildingSys = BuildingSys.BuildingSys()
worldMapSys = WorldMapSys.WorldMapSys()#整体控制类
class AirTestForSLG:#自动游戏方法def AutoGame(self):print("start...")#脚本中的方法调用noviceGuideSys.NoviceGuideStory1()airTestForSLG = AirTestForSLG()
airTestForSLG.AutoGame()

BasicsConsoleSys类,一些基础的操作,后续一些操作方法会在这里定义 

BasicsConsoleSys.py

# -*- encoding=utf8 -*-
__author__ = "GH"from airtest.core.api import *auto_setup(__file__)#--基础功能类--
class BasicsConsoleSys:#检测图片是否存在(正向);图片,图片名字def CheckImageBe(self,imagePath,imageName="图片",mark=False):try:assert_exists(imagePath, "检测图片是否存在")print(imageName+"存在")mark = Truereturn markexcept:print("抛出异常,"+imageName+"不存在") mark = Falsereturn mark#检测图片是否存在(快速);图片,图片名字def CheckImageBe_Quick(self,imagePath,imageName="图片",mark=False):pos = exists(imagePath)if pos:print(imageName+"存在")mark = Truereturn markelse:print(imageName+"不存在")mark = Falsereturn mark#检测并且点击图片(正向);图片,间隔时间,图片名字def CheckAndClikeImage(self,imagePath,sleepTime,imageName="图片"):try:assert_exists(imagePath, "检测图片是否存在")print(imageName+"存在,并且等待"+str(sleepTime)+"秒后开始点击该图片")sleep(sleepTime)touch(imagePath)except:print("抛出异常,"+imageName+"不存在,点击失败")#检测并且点击图片(快速);图片,间隔时间,图片名字def CheckAndClikeImage_Quick(self,imagePath,sleepTime,imageName="图片"):pos = exists(imagePath)if pos:print(imageName+"存在,并且等待"+str(sleepTime)+"秒后开始点击该图片")sleep(sleepTime)touch(pos)else:print(imageName+"不存在")#检测并且点击图片(正向);图片,间隔时间,点击位置,图片名字def CheckImageAndClikePoint(self,imagePath,sleepTime,clickPoint,imageName="图片"):try:assert_exists(imagePath, "检测图片是否存在")print(imageName+"存在,并且等待"+str(sleepTime)+"秒后开始点击坐标")sleep(sleepTime)touch(clickPoint)except:print("抛出异常,"+imageName+"不存在,点击失败")#检测并且点击图片(快速);图片,间隔时间,点击位置,图片名字def CheckImageAndClikePoint_Quick(self,imagePath,sleepTime,clickPoint,imageName="图片"):pos = exists(imagePath)if pos:print(imageName+"存在,并且等待"+str(sleepTime)+"秒后开始点击该坐标")sleep(sleepTime)touch(clickPoint)else:print(imageName+"不存在")#打开当前一级界面;界面名字,功能后面补全def OpenScence(self,scenceName):if scenceName =="地图":print("切换地图")elif scenceName=="英雄":print("打开英雄")elif scenceName=="背包":print("打开背包")elif scenceName=="邮件":print("打开邮件")elif scenceName=="联盟":print("打开联盟")elif scenceName=="聊天":print("打开聊天")elif scenceName=="任务":print("打开任务")elif scenceName=="头像":print("打开头像")elif scenceName=="战力":print("打开战力")elif scenceName=="vip":print("打开vip")elif scenceName=="燃油资源":print("打开燃油资源")elif scenceName=="食物资源":print("打开食物资源")elif scenceName=="钢铁资源":print("打开钢铁资源")elif scenceName=="合金资源":print("打开合金资源")elif scenceName=="充值":print("打开充值")elif scenceName=="第一建造队列":print("点击第一建造队列")elif scenceName=="第二建造队列":print("点击第二建造队列")else:print("打开界面输入错误,找不到的界面")

NoviceGuideSys类,实现新手指引中的功能,大部分是一些长片段或者短片段的剧情流程

NoviceGuideSys.py

# -*- encoding=utf8 -*-
__author__ = "GH"from airtest.core.api import *auto_setup(__file__)import syspath2 = 'E:\\AirTestForSLG\\BasicsConsoleSys.air'
sys.path.append(path2)#加载其他脚本实例
import BasicsConsoleSys
basicsConsoleSys = BasicsConsoleSys.BasicsConsoleSys()#--新手指引类--
class NoviceGuideSys:#关闭角色剧情;剧情人物名字def CloseRolePlot(self,name):if name == "后勤":print("关闭后勤剧情")basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\后勤.png", record_pos=(-0.002, -0.135), resolution=(542, 966)),0.5,"后勤")else:print("输入名字错误")#讲解剧情存在时点击坐标;图片路径def ClickWhenExplain(self,imagePath,imageName="图片"):if(basicsConsoleSys.CheckImageBe(Template(r"Image\\剧情讲解.png", record_pos=(0.033, -0.035), resolution=(542, 966)),"讲解剧情")==True):sleep(0.5)pos = exists(imagePath)if pos:touch(pos)else:print("没有找到点击的图片")else:print("讲解剧情不存在")#新手指引剧情1def NoviceGuideStory1(self):#关闭后勤剧情self.CloseRolePlot("后勤")#关闭后勤剧情self.CloseRolePlot("后勤")#点击市政厅basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\市政厅废弃.png", record_pos=(-0.002, -0.009), resolution=(542, 966)),1,"市政厅废弃")#等待播放动画sleep(5.0)#关闭后勤剧情self.CloseRolePlot("后勤")#点击英雄图标basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\英雄图标.png", record_pos=(-0.244, 0.814), resolution=(542, 966)),1,"英雄图标")#点击招募按钮basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\招募按钮.png", record_pos=(0.332, 0.57), resolution=(542, 966)),1,"招募按钮")#等待播放动画sleep(3.0)#点击英雄海报(小女孩)basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\小女孩海报.png", record_pos=(-0.009, -0.006), resolution=(542, 966)),1,"英雄海报(小女孩)")#点击左上角装备栏self.ClickWhenExplain(Template(r"Image\\左上角装备栏.png", record_pos=(-0.36, -0.465), resolution=(542, 966)),"左上角装备栏")#剧情讲解存在时点击光圈self.ClickWhenExplain(Template(r"Image\\属性面板1.png", record_pos=(-0.004, 0.522), resolution=(542, 966)),"属性面板1")#点击穿上按钮basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\穿上按钮.png", record_pos=(-0.002, 0.792), resolution=(542, 966)),0.5,"穿上按钮")#剧情讲解存在时点击光圈self.ClickWhenExplain(Template(r"Image\\返回按钮.png", record_pos=(-0.41, -0.712), resolution=(542, 966)),"返回按钮")#点击市政厅完整basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\市政厅完整.png", record_pos=(-0.024, -0.011), resolution=(542, 966)),1,"市政厅完整")#点击委任按钮basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\委任按钮.png", record_pos=(0.149, 0.14), resolution=(542, 966)),0.5,"委任按钮")#剧情讲解存在时点击光圈self.ClickWhenExplain(Template(r"Image\\属性板.png", record_pos=(0.0, 0.197), resolution=(542, 966)),"属性板")#点击选择按钮basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\选择按钮.png", record_pos=(-0.002, 0.806), resolution=(542, 966)),0.5,"选择按钮")#等待播放动画sleep(5.0)#关闭后勤剧情self.CloseRolePlot("后勤")#点击市政厅完整(近)basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\市政厅完整近.png", record_pos=(-0.02, -0.013), resolution=(542, 966)),1,"市政厅完整(近)")#点击建筑升级按钮basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\建筑升级按钮.png", record_pos=(-0.072, 0.216), resolution=(542, 966)),0.5,"建筑升级按钮")#点击建筑升级按钮basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\升级按钮.png", record_pos=(0.22, 0.812), resolution=(542, 966)),0.5,"升级按钮")    #等待播放动画sleep(6.0)#关闭升级完成界面;锚点为8basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\关闭升级完成界面.png", target_pos=8, record_pos=(-0.002, 0.131), resolution=(542, 966)),0.5,"关闭升级完成界面")#关闭后勤剧情self.CloseRolePlot("后勤")#点击开放区域basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\开放区域.png", record_pos=(0.0, 0.031), resolution=(542, 966)),0.5,"开放区域")#等待播放动画sleep(6.0)#点击空地1basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\空地1.png", record_pos=(0.004, 0.028), resolution=(542, 966)),1,"空地1")#点击建造按钮(建筑列表)basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\建造按钮建筑按钮.png", record_pos=(0.0, 0.803), resolution=(542, 966)),1,"建造按钮")#点击建造按钮(建筑页)basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\建筑页建造按钮.png", record_pos=(0.223, 0.808), resolution=(542, 966)),0.5,"建造按钮")#点击气泡basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\气泡.png", record_pos=(0.0, -0.161), resolution=(542, 966)),0.5,"气泡")#剧情讲解存在时点击光圈self.ClickWhenExplain(Template(r"Image\\任务1.png", record_pos=(-0.17, 0.644), resolution=(542, 966)),"任务")#关闭后勤剧情self.CloseRolePlot("后勤")#点击重返都市basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\重返都市.png", record_pos=(0.203, -0.673), resolution=(542, 966)),0.5,"重返都市") #剧情讲解存在时点击光圈self.ClickWhenExplain(Template(r"Image\\领取按钮.png", record_pos=(0.334, -0.185), resolution=(542, 966)),"领取按钮")#关闭获得奖励界面basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\重返都市确定按钮.png", record_pos=(0.006, 0.395), resolution=(542, 966)),1,"重返都市确定按钮") #关闭重返都市界面basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\重返都市关闭按钮.png", record_pos=(0.411, -0.707), resolution=(542, 966)),0.5,"重返都市关闭按钮") #关闭后勤剧情self.CloseRolePlot("后勤")#点击任务basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\任务2.png", record_pos=(-0.173, 0.642), resolution=(542, 966)),0.5,"任务") #点击空地2basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\空地2.png", record_pos=(0.007, 0.039), resolution=(542, 966)),1,"空地2") #点击建造按钮(建筑列表)basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\建造按钮建筑按钮.png", record_pos=(0.0, 0.803), resolution=(542, 966)),1,"建造按钮")#点击建造按钮(建筑页)basicsConsoleSys.CheckAndClikeImage(Template(r"Image\\建筑页建造按钮.png", record_pos=(0.223, 0.808), resolution=(542, 966)),0.5,"建造按钮")#noviceGuideSys =NoviceGuideSys()      #单独调试时用
#noviceGuideSys.NoviceGuideStory1()    #单独调试时用

四、其他备注

1.双击图片可以打开图片设置,锚点设置为8,即为点击图片的下方位置,默认为5,点击图片正中间

2.图片是通过touch方法或者exists的方法获取到,是一个路径,需要改路径的话需要在路径前面加上图片的上一级菜单,不然会获取图片失败,运行脚本前需要检查一下图片显示正常。

连接游戏画面后,直接运行NoviceGuideSys脚本就自动跑完了新手指引功能。

【AirTest实例】1.使用脚本自动跑通游戏引导相关推荐

  1. 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)

    大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...

  2. 使用Jenkins的任务自动跑脚本后发现,服务没有起来

    在Jenkins的使用中,遇到过的一个场景是:在web代码更改之后,能自动的部署到测试服务器,我们写了run.sh脚本来重启服务,在使用Jenkins的任务自动跑这个脚本后发现,服务没有起来.开始以为 ...

  3. 亮度 脚本 android,光遇自动跑图脚本

    光遇自动跑图脚本可以释放玩家的手并自动结束游戏的应用程序.无需root用户即可直接使用自动地图软件.它支持多种手机型号,并直接提供自动地图协助. 赶紧来试试吧!非常的好操作哟! 光遇自动跑图脚本介绍: ...

  4. Copy攻城狮辛酸史:含泪“一分钟”跑通MindSpore的LeNet模型

    摘要:一个Cope 攻城狮用切身实例告诉你: Cope代码体验一时爽,BUG修改花半天. 前言:此文为r0.7-beta的操作实践,为什么我的眼里常含泪水,因为我对踩坑这件事爱得深沉.谨以此文献给和我 ...

  5. 如何跑通第一个 SQL 作业

    简介:本文由阿里巴巴技术专家周凯波(宝牛)分享,主要介绍如何跑通第一个SQL.内容将从以下3个部分介绍:1.SQL的基本概念:2.SQL的语法说明:3.SQL 实战: 作者 | 周凯波(宝牛),阿里巴 ...

  6. shell编程实例 — 实现4G开机自动运行,实时监测,断线自动重拨》

    shell编程实例 - 实现4G开机自动运行,实时监测,断线自动重拨> 往事只能回味味道 于 2021-11-20 02:30:53 发布831 收藏 1 分类专栏: shell 文章标签: u ...

  7. 深度学习之初识篇——小白也能跑通的深度学习万能框架【交通标识牌检测】

    目录 环境下载:点击即可 数据集下载:点击即可 深度学习环境配置 点击下载深度学习环境 数据集准备 使用自己标注的数据集 使用标注软件 数据准备 VOC标签格式转yolo格式并划分训练集和测试集 部署 ...

  8. 在Rockchip RK3399 Pro开发板上跑通第一个Qt程序

    在Rockchip RK3399 Pro开发板上跑通第一个Qt程序 准备工作:将Qt从Windows移植到Linux 一.交叉编译器的准备 下载交叉编译工具 安装交叉编译工具 二.交叉编译Qt库 三. ...

  9. 【全网唯一】全网唯一能够跑通的,跑不通你来找我~用node.js完成微信支付下单功能,且只需要一个文件wxpay.js就解决业务流程的node.js程序

    先吐为敬! 最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆"代码拷贝党"."留一手"."缺斤少两"."不 ...

最新文章

  1. 【Paper】2010_Distributed optimal control of multiple systems
  2. iOS之深入解析少见却神奇的NSProxy类的多种使用
  3. 找出数组中两个只出现了一次的数
  4. 两次被裁之后,我终于解决了数据库缓存一致性问题
  5. WiFi生成二维码卡片共享源码
  6. vue、bus 使用遇到的坑,组件之间无法传值;vue、bus 第一次获取不到值,后面再点击重复执行
  7. CRMEB知识付费系统v1.4.4源码
  8. 100个灯泡python编程_算法题:一个圆环上有100个灯泡,灯泡有打...
  9. 连续3年入围 Gartner 容器竞争格局,阿里云容器服务新布局首次公开
  10. shell 学习笔记2
  11. 20210801:AXI-Lite总线逻辑与关键源码分析
  12. 关闭浏览器网页触发事件_浏览器是如何工作的?
  13. java 释放锁,在Java中以原子方式释放多个锁
  14. 汇编语言王爽 实验七
  15. GIT上优秀的IOS框架
  16. 正则表达式训练-QQ号校验
  17. iOS 开发的一些奇巧淫技
  18. 世界杯winner只属于你——MESSI
  19. java微信公众号开发之各种事件推送
  20. matlab图片不覆盖,放置MATLAB图例,使其在图上不重叠

热门文章

  1. 随笔-我的富二代同事们
  2. 炫舞时代一直服务器维修,炫舞时代出皇宫大区前世今生系统bug修复详情 炫舞时代皇宫大区前世异常问题最新解决方案...
  3. sysctl 默认值_sysctl.conf文件配置详解
  4. 智慧城市,科技的智慧的产物
  5. MyBatis-小葵花宝典
  6. 获取 挂载有Content Size Fitter 组件的UI物体的 宽 和 高
  7. 冒志鸿(美国ArcBlock创始人兼CEO)
  8. 计算 n 个字节能表示的最大整数
  9. SSL/TLS证书过期了怎么办?
  10. 全国青少年信息素养大赛2023年python·选做题模拟一卷