UiAutomator python+uiautomator2 实现多设备并行

M · November 22, 2019 · Last by testBlue replied at December 06, 2019 · 1282 hits

由于python的全局解释器锁,无法实现线程并行,要想实现并行,可以通过多进程实现
创建多进程需要用到python模块为mulitmultiprocessing,具体用法和多线程差不多

进入正题:
首先,创建一个project_conf.py的配置文件,用来存放手机的sn号,这个sn号需要全局用到,而且不会改变

#project_conf.py
#默认为空
PROJECT_SN = ''

然后创建一个读取设备SN号的函数,随便哪个模块,能调用就行,我是放在入口文件main.py中

def get_devices_list():
""" 获取手机设备"""
cmd = r'adb devices'
pr = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
pr.wait()
out = pr.stdout.readlines() # out = pr.stdout.read().decode("UTF-8")
devices = []
for i in (out)[1:-1]:
device = str(i).split("\\")[0].split("'")[-1]
devices.append(device)
return devices

再实现多线程

if __name__ == '__main__':
#进程列表
p = []
devices = getphonelist()#取得设备列表
for i in devices:
#此处main为脚本入口,每有一个设备,便创建一个进程,传入sn号供程序全局使用
i = Process(target=main,args=(i,))
p.append(i)
for i in p:
i.start()
for i in p:
i.join()

main函数:

import project_conf
def main(device):
#给此全局SN赋值,供脚本全局使用,如连接设备,区分log,截图命名等
project_conf.PROJECT_SN=device
#运行测试
pytest.main()
共收到 13 条回复 时间 点赞

有帮助,不错

获取设备列表还可以这样。

import adbutils

for d in adbutils.adb.device_list():
print(d.serial)
M #3 · November 26, 2019 作者
codeskyblue 回复

嗯嗯,谢谢指导

M #4 · November 26, 2019 作者

这里再补充一点,如果增加GUI,使用BUTTON回调函数调用的话,多进程中的join函数需要去掉,否则会造成GUI无响应

大神,想问个问题,这个是解决同一套脚本分别执行多个手机的场景吗

M #6 · December 04, 2019 作者
testBlue 回复

是的

大佬多问一句,有这么一种场景,比如测试登录页面,同一个脚本运行两台手机,但是每台手机需要登录不同的手机号才能跑,不可能登录一个手机号,但是脚本却是同一套,前后矛盾如何处理呢

M #8 · December 06, 2019 作者
testBlue 回复

可以试试把数据分离出来,然后根据SN号发送对应的测试数据给手机

我看您先获取到sn之后,下面的步骤我有一点不明白的是,如何通过进程函数关联到sn号从而分别执行的呢

M #10 · December 06, 2019 作者
testBlue 回复

你在开启多线程的时候多传一个电话号码的参数过去就可以了,像传SN一样
Process(target=main,args=(i,number))

我看您没有涉及到d = u2.connect_usb(Setting_Con.devices_id)这个方法,您是如何给这个方式传递SN的呢,这个方式是直接操作手机的了,多个设备的话是不是在这里就开始区分开了呢

M #12 · December 06, 2019 作者
testBlue 回复

这个看你自己的封装了,连接设备的操作在区分之后进行,通过设备分了进程之后再连接,你去看一下multiprocessing模块

辛苦辛苦大佬

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up