前言
最近一个月忙着公司的事情,没能抽空来写写博客,这次来实践一下那状态机结合airtest帮我自动做新手,过程不注重,目的是帮我跑完新手,新手能跑通就可以了,这个项目基本是自动做任务的,如果碰到和我类型一样的可以试试,仅供参考,练练手。
环境
1、airtest,安装这些就不重复写了,看我前面写的或者自动百度
2、状态机可以参考我前面写的状态机结合测试用例
正文
一、定义任务状态
我这里的任务过程分为4个,如有差别自行修改
class TaskState(Enum):
'''接受任务,进行任务,完成任务,交付任务'''
FREE = 0
ACCEPT = 1
UNDERWAY = 2
FINISH = 3
DELIVERY = 4
二、定义任务状态机
1、初始化
主要是绑定进入和退出状态的执行方法
airtest_api指向 …python3.6/site-packages/airtest/core/api.py
class TaskMachine:
def __init__(self):
self.machine = Machine(model=self, states=TaskState, initial=TaskState.FREE)
self.airtest = airtest_api # 这里是airtest的api文件
self.airtest.img_path = Path(__file__).parent / 'imgFolder'
# 进入与退出状态要执行的方法
self.machine.on_enter_ACCEPT('accept_task')
self.machine.on_enter_UNDERWAY('underway_task')
self.machine.on_exit_UNDERWAY('find_back')
self.machine.on_enter_FINISH('finish_task')
self.machine.on_enter_DELIVERY('delivery_task')
2、接任务
self.airtest.img_assert_mothod: 是我自定义的方法,可以直接换成api提供的方法,比如assert_exists 换成 assert_exists(‘taskLine.png’, msg=‘接任务’) 即可
to_UNDERWAY(): 转到进行任务转态
def accept_task(self):
task_icon = self.airtest.img_assert_mothod(assert_exists, 'taskLine.png', case_msg='接任务')
if task_icon:
touch(task_icon)
self.to_UNDERWAY()
3、进行任务
我这里的新手任务,每一步都会有个指引"手指头",所以我每一次只要找到这个手指头进行点击即可
def underway_task(self):
guide_list = ['guide1.png','guide2.png']
for guide_img in guide_list:
for _ in range(4):
guide_icon = self.airtest.img_assert_mothod(assert_exists, guide_img, case_msg='进行任务')
if guide_icon:
touch(guide_icon1)
continue
else:
self.to_FINISH()
4、任务完成
我这里的任务完成了,主页面的主线会有一个完成标记,出现标记责表示完成了任务
def finish_task(self):
# 等待那个完成的标记出现
flag_list = ['finishFlag1.png','finish.png']
for flag_img in flag_list:
finish_flag = wait(Template(self.call_airtest.img_path + flag_img), 10)
if finish_flag:
self.to_DELIVERY()
break
5、交付任务
转到这个状态就点下完成任务
def delivery_task(self):
finish_task_icon = self.airtest.img_assert_mothod(assert_exists, 'finish.png', case_msg='完成任务')
if finish_task_icon:
touch(finish_task_icon)
# 要内循环要控制次数,否则超出递归深度
# self.to_ACCEPT()
# else:
#self.to_UNDERWAY()
6、运行
运行100次任务
if __name__ == '__main__':
task = TaskMachine()
for _ in range(100):
task.to_ACCEPT()
time_str = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
simple_report(__file__, output=REPORTPATH / f'TEST{time_str}.html', logpath=str(LOGPATH))
结语
任务状态转换关系需要梳理一下,我这里没有完成都会转到进行任务,还有我并没有绑定转态转换关系,随意都可转;执行方法我的操作也比较简单,基本是点一下按钮,需要的操作不多,第一次这样结合用,先试试水。
最后的最后,各位的关注、点赞、收藏、是对我最大的支持!
欢迎小伙伴关注微信公众号ID:gameTesterGz