一、在AirtestIDE里连接Android手机
使用AirtestIDE对Android应用进行自动化测试时,第一步就需要连接Android设备。
设备的支持情况
目前支持市面上几乎绝大多数Android手机、Android模拟器
设备连接的特殊选项设置
有少数非手机的Android设备(例如智能电视、智能后视镜等),直接点击connect
按钮不能连接,但是可以尝试通过勾选connect
下拉菜单中的选项来尝试连接。
例如,我们的默认连接方式不支持模拟器,因此在连接模拟器时,需要先勾选Use Javacap
选项(部分品牌模拟器还要同时勾选Use ADB orientation
)。这里connect
下拉菜单的三个选项,是截屏、旋转和点击的三个备选方案,在默认方案无法生效的时候,使用这3个备选方案可能就可以支持设备了。
注意:部分品牌手机不支持某个功能,可能仅仅只是因为选项没有开启,例如小米手机必须要开启了允许模拟点击
才能够在AirtestIDE中使用默认方式点击手机(速度更快,效果更好)。如果是正常的手机设备,遇到问题时请尽量先查阅文档排查问题。这几个备选方案的效率都比默认方案低,只有部分特殊的Android设备才需要使用到备选方案。
每个接口支持的平台可能各不相同,而Android支持的接口是最全面、最丰富的。基本上airtest.core.api
中的接口(
# 清理某个应用数据 clear_app("org.cocos2d.blackjack") # 启动某个应用 start_app("org.cocos2d.blackjack") # 传入某个按键响应 keyevent("BACK")
Android设备接口
除了在airtest.core.api
中提供的跨平台接口之外,Android设备对象还有很多内置的接口可以调用,可以在
dev = device() # 获取到当前设备的Android对象 print(dev.get_display_info()) # 查看当前设备的显示信息 print(dev.list_app()) # 打印出当前安装的app列表
ADB指令调用
在Android设备的测试脚本中,有时候我们需要输入一些ADB
指令,如果在普通的Python脚本中想要调用ADB
指令,也许需要用到subprocess
等模块单独启动进程运行命令行才能实现。
但是在Airtest脚本中,调用ADB指令是非常简单的事情:
# 对当前设备执行指令 adb shell ls print(shell("ls")) # 对特定设备执行adb指令 dev = connect_device("Android:///device1") dev.shell("ls") # 切换到某台设备,执行adb指令 set_current(0) shell("ls")
三、启动安卓APP
1.方式一:
通过touch方法点击
touch(Template(r"tpl1621082666068.png", record_pos=(0.362, 0.017), resolution=(720, 1280)))
2.方式二:
通过APP的包名打开,包名就类似人的身份证,用来唯一标识身份使用的
a.查看app的包名
查看APP包名分两种情况:
-
应用已经安装到手机
adb shell dumpsys window w | findstr \/ | findstr name= 或 adb shell dumpsys window |findstr mCurrent 或 adb shell "dumpsys window w|grep \/|grep name=|sed 's/mSurface=Surface(name=//g'|sed 's/)//g'|sed 's/ //g'"
-
已经获得了apk安装包,通过安卓sdk自带的aapt工具实现
D:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging D:\bainianaolai.apk
b.代码实现
# -*- encoding=utf8 -*- __author__ = "11200" from airtest.core.api import * auto_setup(__file__) #百年奥莱包名 bainianaolai = "com.yunmall.lc" #根据包名 停止抖音 stop_app(bainianaolai) #回到桌面 home() #列出当前设置中所有的包名,存放为一个字典 d = device() all_package = d.list_app() if bainianaolai in all_package: start_app(bainianaolai)
四、实战:百年奥莱登录操作
# -*- encoding=utf8 -*- from airtest.core.api import * from poco.drivers.android.uiautomation import AndroidUiautomationPoco poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False) #百年奥莱包名 bainianaolai = "com.yunmall.lc" #根据包名 停止抖音 stop_app(bainianaolai) #回到桌面 home() #列出当前设置中所有的包名,存放为一个字典 d = device() all_package = d.list_app() if bainianaolai in all_package: start_app(bainianaolai) sleep(1.0) #点击 我 poco(name="com.yunmall.lc:id/tab_me").click() #点击 选择 已有账户 去登录 poco(name="android.widget.ImageView").click() #输入用户名,注意先需要点击一下,需要输入的内容,聚焦到该元素,然后在输入内容 username = poco(name="com.yunmall.lc:id/logon_account_textview") username.click() username.set_text("Auguses") #输入密码,同用户名输入一样 password = poco(resourceId="com.yunmall.lc:id/logon_password_textview") password.click() password.set_text("qweasd1234") #点击 登录 按钮 poco(name="com.yunmall.lc:id/logon_button").click() sleep(3) #获取用户名 get_text() 可以获取选择中元素的文本信息 name = poco(name="com.yunmall.lc:id/tv_user_nikename").get_text() #断言 assert_equal(name, "Auguses") #点击 设置按钮 poco(name="com.yunmall.lc:id/ymtitlebar_left_btn_image").click() #向下滑动 #swipe(Template(r"tpl1621086981253.png", record_pos=(-0.344, 0.849), resolution=(720, 1280)), vector=[0.0228, -0.7056]) poco.swipe([0.5,0.8],[0.5,0.2]) #点击 退出 按钮 poco(name="com.yunmall.lc:id/setting_logout").click() #确认退出 poco(name="com.yunmall.lc:id/ymdialog_right_button").click()