Airtest的多机协作、交互及设备切换set_current()
上期回顾:Airtest+Poco常见Exception报错
以下基于
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85
一般其他的UI自动化框架,虽然支持并发测试,但每个端之间是分隔的,不方便交互。而Airtest天生支持多机之间的交互操作,比如你可以控制两台手机聊微信。
一、如何连接多台设备:
1.1在AirtestIDE中连接多台设备
以安卓为例,ios好像没有提供连接多台设备的UI。
1.插上两台手机,在设备连接栏刷新可以看到两台设备,先连接一台
2.第1台连接成功后,右上角会出现俩个按钮,左边的按钮就是用来切换设备或者切换到刚才连接设备的面板,选择切回面板
3.再次连接第2台设备。之后就可以通过那个按钮切换设备画面,或是切回面板,断开连接
1.2在脚本中连接多台设备
from airtest.core.api import *
# 连接第一台手机
dev1 = connect_device("Android://127.0.0.1:5037/serial1")
# 连接第二台手机
dev2 = connect_device("Android://127.0.0.1:5037/serial2")
# IP和接口默认情况下不会变,所以可以简写为
dev1 = connect_device("Android:///serial1")
dev2 = connect_device("Android:///serial2")
connect_device()详解可以看之前文章:Airtest API精讲之设备连接管理API集合
设备连接符怎么写可以看之前文章:Airtest命令行运行airtest run详解
1.3通过命令行连接多台设备(推荐)
实际跑自动化的时候,一台PC可能插着很多手机,我们不可能连着AirtestIDE,另外把序列号写死在脚本中也不方便。所以需要用到Airtest的命令行来连接多台设备
# android
airtest run "D:\qasite.air" --device "android:///65fade15" --device "android:///8d8fd86" --log "D:\log"
#ios
airtest run "D:\qasite.air" --device "ios:///http+usbmux://07bbb06a267ee" --device "ios:///http+usbmux://as9dfdfs87" --log "D:\log"
airtest run详情可以看:Airtest命令行运行airtest run详解
二、连接多台设备后如何切换设备
在连接上多台设备后,我们可以通过print(G.DEVICE_LIST)
查看当前的两个设备对象实例
之后我们可以通过set_current()来切换当前设备
set_current(idx)
将当前操作手机切换为指定设备,idx可以是下标也可以是设备序列号。
源码解析:
# 源码位置:your_python_path\site-packages\airtest\core\api.py
def set_current(idx):
dev_dict = {dev.uuid: dev for dev in G.DEVICE_LIST}
if idx in dev_dict:
current_dev = dev_dict[idx]
elif isinstance(idx, int) and idx < len(G.DEVICE_LIST):
current_dev = G.DEVICE_LIST[idx]
else:
raise IndexError("device idx not found in: %s or %s" % (
list(dev_dict.keys()), list(range(len(G.DEVICE_LIST)))))
G.DEVICE = current_dev
第一行,先定义一个字典,遍历所有设备实例,将设备uuid(安卓是序列号)设为键(key),值(value)为设备实例
第二行,如果传入uuid在字典中,则将current_dev赋值为该设备实例
第四行,判断如果传的是下标,且下标值不超过设备数,则将current_dev赋值为指定下标的设备实例
最后一行,将current_dev赋值给G.DEVICE,G.DEVICE保存当前设备实例
示例:
from airtest.core.api import *
# 可以通过下标切换设备,下标从0开始
set_current(0)
set_current(1)
set_current(2)
# 也可以通过序列号切换设备
set_current("serial1")
set_current("serial2")
三、多机协作实例
我们以两台手机相互聊微信为例,通过命令行方式连接两台手机。
# __author__ = '测试工程师小站'
# __title__ = '微信聊天'
# __desc__ = '双机交互测试'
from airtest.core.api import *
from poco.drivers.unity3d import UnityPoco
poco0 = UnityPoco(device=G.DEVICE_LIST[0])
poco1 = UnityPoco(device=G.DEVICE_LIST[1])
set_current(0)
sleep(10)
poco0('微信icon').click()
poco0('与手机1的聊天列表').click() # 假设已经有聊天记录了,如果没有,则通过通讯录发起聊天
poco0('聊天框').click()
text('今天你看测试工程师小站文章了吗')
poco0('发送').click()
set_current(1)
sleep(10)
poco1('微信icon').click()
poco1('与手机0的聊天列表').click()
assert_equal(poco1(text='今天你看测试工程师小站文章了吗').exists(), True, '收到手机0的聊天内容')
poco1('聊天框').click()
text('看了,赶紧关注+转发吧')
poco1('发送').click()
set_current(0)
sleep(10)
assert_equal(poco0(text='看了,赶紧关注+转发吧').exists(), True, '收到手机1的聊天内容')
注意:切换设备后,Airtest反应有点慢,一定要多等一会,否则可能因为找不到元素报错
编写完以上脚本后,就可以通过命令运行了,见上面1.3小节
可以通过Python调用命令行执行:python中os.system、os.popen、subprocess.popen的区别
用例执行完毕后,再通过airtest report
命令生成报告:Airtest生成报告命令行airtest report详解
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~