UiAutomator python+uiautomator2 实现多设备并行

FyueC · 2019年11月22日 · 最后由 testBlue 回复于 2019年12月06日 · 5969 次阅读

由于 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)
codeskyblue 回复

嗯嗯,谢谢指导

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

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

testBlue 回复

是的

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

testBlue 回复

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

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

FyueC #10 · 2019年12月06日 Author
testBlue 回复

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

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

testBlue 回复

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

辛苦辛苦大佬

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册