Airtest入门篇-4登录游戏函数


前言

先回顾下第三章写的例子,函数写的较为简单,接下来把这个扩展更多的功能,更多的是带着练习和熟悉Python语法的想法。

实践

给函数添加一个参数

这里主要是把之前写死的手机号码、密码、名字、身份证转换成参数输入,当需要换账号登录的时候不用去函数里面改动,调用函数的时候输入即可

给参数声明它的数据类型: 方便后续自己或他人调用的时候清晰要传什么数据,用法很简单,比如传的是字符串,在参数后面加 :str,
如果是整型,加 :int,以此类推。

def account_login(phone:str, password:str, name:str, ID_card:str):

如果有测试过这个参数类型声明的同学会知道,这只是个口头约定,Python代码在执行时并不会对你声明的类型进行检查,所以写更严谨的话加上一个参数检查会好一些,加强一点健壮性,咋们用isinstance 内建函数来判断参数类型。
语法:

isinstance(object, type)
object	必需。对象。
type	类型或类,或类型和/或类的元组。

来测试一下

>>> name = '张三'
>>> phone = 10086
>>> password = False
>>> isinstance(name, str)
True
>>> isinstance(name, int)
False
>>> isinstance(phone, int)
True
>>> isinstance(password, bool)
True

做了参数检查之后的代码

def account_login(phone:str, password:str, name:str, ID_card:str):
    '''函数作用就简单做个账号登录功能'''
    if isinstance(phone, str) and isinstance(password, str) and isinstance(name, str) and isinstance(ID_card, str):
            touch(Template(r"tpl1659497603967.png", record_pos=(-0.394, -0.019), resolution=(900, 1600)))
            ...

上面的语句判断也可以用all()内建函数来替换,all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False;元素除了是 0、空、None、False 外都算 True。

利用API-Wait来替换for循环

wait的官方说明

动手改一改


def account_login(phone:str, password:str, name:str, ID_card:str):
    '''函数作用就简单做个账号登录功能'''
    if isinstance(phone, str) and isinstance(password, str) and isinstance(name, str) and isinstance(ID_card, str):
        touch(Template(r"tpl1659497603967.png", record_pos=(-0.394, -0.019), resolution=(900, 1600)))
        wait_agree_png = wait(Template(r"tpl1659497638138.png", record_pos=(0.24, 0.8), resolution=(900, 1600)), 10)
        if wait_agree_png:
            touch(wait_agree_png)
#         for i in range(10):
#             if exists(Template(r"tpl1659497638138.png", record_pos=(0.24, 0.8), resolution=(900, 1600))):
#                 touch(Template(r"tpl1659497638138.png", record_pos=(0.24, 0.8), resolution=(900, 1600)))
#                 print(f'循环到第{i}次')
#                 break
#             sleep(1)
        else:print("agree_png not found")
        sleep(5)
        ...

把原先的for循环注释了,从6行代码变成了3行代码,touch可以接受坐标来进行点击, wait 如果找到图片后返回的是元组坐标,比如(500,600),exists 也是同样的道理。

断言登录状态

咋们写测试用例的时候会写个期待值,执行用例的时候会拿期待值和实际结果进行对比,转换成脚本来执行的时候一样可以相关的断言函数来判断,例如assert_existsassert_not_exists

在操作账号登录后进行一个断言

用start_app来启动游戏

要用这个API来启动游戏需要传入包名,包名可以通过aapt命令来获取,先在命令行输入aapt 看看本地环境有没有问题,没安装的可以切换到airtest目录下的aapt路径;
类似路径:…/AirtestIDE/plugins/firebase_plugin/tool/aapt.exe

游戏包附件
接下来命令,格式: aapt dump badging 你的apk包路径

aapt dump badging .../douluodalu_1001.apk

返回很多信息,找到我们需要的包名:‘com.jiguang.dldl.sy37’

package: name='com.jiguang.dldl.sy37' versionCode='1020' versionName='9.5.9' platformBuildVersionName='6.0-2438415' compileSdkVersion='23' compileSdkVersionCodename='6.0-2438415'
sdkVersion:'19'
targetSdkVersion:'26'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.ACCESS_WIFI_STATE'
uses-permission: name='android.permission.READ_PHONE_STATE'
...

改下代码:
把原来的点击游戏图标改成start_app就行,注释了原来touch游戏图标

def account_login(phone:str, password:str, name:str, ID_card:str):
    '''函数作用就简单做个账号登录功能'''
    if isinstance(phone, str) and isinstance(password, str) and isinstance(name, str) and isinstance(ID_card, str):
        start_app('com.jiguang.dldl.sy37')
#         touch(Template(r"tpl1659497603967.png", record_pos=(-0.394, -0.019), resolution=(900, 1600)))
        wait_agree_png = wait(Template(r"tpl1659497638138.png", record_pos=(0.24, 0.8), resolution=(900, 1600)), 10)
        ...

用stop_app关闭游戏

同start_app一样的使用方法,在想要的结束游戏的地方插入这行代码即可,我在最底下写上了,顺便把整个代码都贴上。

# -*- encoding=utf8 -*-
__author__ = "mingjiexiao"

from airtest.core.api import *

auto_setup(__file__)


def account_login(phone:str, password:str, name:str, ID_card:str):
    '''函数作用就简单做个账号登录功能'''
    if isinstance(phone, str) and isinstance(password, str) and isinstance(name, str) and isinstance(ID_card, str):
        start_app('com.jiguang.dldl.sy37')
#         touch(Template(r"tpl1659497603967.png", record_pos=(-0.394, -0.019), resolution=(900, 1600)))
        wait_agree_png = wait(Template(r"tpl1659497638138.png", record_pos=(0.24, 0.8), resolution=(900, 1600)), 10)
        if wait_agree_png:
            touch(wait_agree_png)
        else:print("agree_png not found")
        sleep(5)
        if exists(Template(r"tpl1659497696990.png", record_pos=(0.257, 0.216), resolution=(900, 1600))):
            touch(Template(r"tpl1659497696990.png", record_pos=(0.257, 0.216), resolution=(900, 1600)))
            touch(Template(r"tpl1659497719839.png", record_pos=(-0.137, -0.092), resolution=(900, 1600)))
            text(phone)
            touch(Template(r"tpl1659497727593.png", record_pos=(-0.126, 0.031), resolution=(900, 1600)))
            text(password)
            touch(Template(r"tpl1659497751096.png", record_pos=(0.0, 0.207), resolution=(900, 1600)))
            sleep(5)
        if exists(Template(r"tpl1659498334544.png", record_pos=(0.01, -0.294), resolution=(900, 1600))):
            touch(Template(r"tpl1659498346819.png", record_pos=(-0.126, -0.038), resolution=(900, 1600)))
            text(name)
            touch(Template(r"tpl1659498369494.png", record_pos=(-0.073, 0.076), resolution=(900, 1600)))
            text(ID_card)
            touch(Template(r"tpl1659498380657.png", record_pos=(-0.002, 0.202), resolution=(900, 1600)))
        sleep(5)
        assert_exists(Template(r"tpl1660031495689.png", record_pos=(-0.003, 0.251), resolution=(900, 1600)), "账号登录成功,出现进入游戏按钮")
        sleep(5)
        stop_app('com.jiguang.dldl.sy37')
        
    else:
        return "args error"

account_login('手机号码', '密码', '张三' , '张三的身份证号码')


结语

这一章更多是在练习Python语法和熟悉Airtest的API,这里还可以把登录函数继续拓展,比如把包名参数化、切换登录账号、注册失败的时候要怎么处理等等。

欢迎小伙伴关注微信公众号ID:gameTesterGz
谢谢各位的关注、点赞!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游戏测试-AJian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值