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详解

 

---------------------------------------------------------------------------------

关注微信公众号即可在手机上查阅,并可接收更多测试分享~

posted @ 2022-07-08 22:56  ☆星空物语☆  阅读(1533)  评论(0编辑  收藏  举报