前言
先回顾下第三章写的例子,函数写的较为简单,接下来把这个扩展更多的功能,更多的是带着练习和熟悉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_exists ,assert_not_exists 。
在操作账号登录后进行一个断言
用start_app来启动游戏
![](https://i-blog.csdnimg.cn/blog_migrate/5796e4f868d10cfeb367b079a9f5ad7f.png)
要用这个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
谢谢各位的关注、点赞!