zoukankan      html  css  js  c++  java
  • appium--多进程启动多设备

    前戏

    在前面我们都是使用一个机器进行测试,在做app自动化的时候,我们要测不同的机型,也就是兼容性测试,如果一台一台设备去执行,那就显的太麻烦了。所以经常需要我们启动多个设备,同时跑自动化测试用例,要跑多个设备时,首先要启动多个appium服务。

    启动多个appium服务

    在之前我们都是在命令行里输入appium来启动appium服务,这样启动的默认端口是4723,我们可以使用-p参数来指定端口号,输入appium等价与appium -p 4723

     启动另一个服务

    appium -p 4725

     这样我们就启动了两个appium服务。

    服务要隔一个数字,如端口为4723,则4724为连接安卓设备的端口号,所以下个服务为4725

    appium的参数

    appium不止一个参数-p,还有其他的参数

    参数  默认值 含义
    -U,--udid null 连接物理设备的唯一设备标识符
    -a,--address 0.0.0.0 监听的ip地址
    -p,--port 4723 监听的端口
    -bp,--bootstrap-port 4724 连接Android设备的端口号(Android-only)
    -g,--log   null 将日志输出到指定文件
    --no-reset false  session之间不重置应用状态
    --session-override false 允许session被覆盖(冲突的话)
    --app-activity null 打开Android应用时,启动的Activity的名字
    --app null 本地app的路径或远程的安装包

    其他的参数可以使用appium -h查看

     多设备启动

    前提条件:

    1.连接两个机器

    2.启动两个服务

    yaml文件

    platformName: Android
    platforVersion: 6.1.1
    deviceName: 127.0.0.1:62001
    appPackage: com.jgw.csca
    appActivity: com.jgw.csca.view.activity.LoginActivity
    unicodeKeyboard: True
    resetKeyboard: True
    noReset: False
    ip: 127.0.0.1
    port: 4723

    脚本

    from appium import webdriver
    import yaml
    
    devices_list = ['127.0.0.1:62001', '127.0.0.1:62025']  # 两个设备
    
    '''
    udid是设备的,如果是真机,这个必须有,有udid后deviceName就可以随便写一个
    port是appium服务的端口,我启动的是4723和4725
    '''
    def desiredCaps(udid, port):
        with open('../conf/capability.yaml', 'r', encoding='utf-8') as file:
            data = yaml.load(file, Loader=yaml.FullLoader)
        desired_caps = {}
        desired_caps['platformName'] = data['platformName']
        desired_caps['platforVersion'] = data['platforVersion']
        desired_caps['deviceName'] = data['deviceName']
        desired_caps['udid'] = udid
        desired_caps['appPackage'] = data['appPackage']
        desired_caps['appActivity'] = data['appActivity']
        desired_caps['unicodeKeyboard'] = data['unicodeKeyboard']
        desired_caps['resetKeyboard'] = data['resetKeyboard']
        desired_caps['noReset'] = data['noReset']
        driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(port)+ '/wd/hub', desired_caps)
        '''
        第一次启动
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        第二次启动
        driver = webdriver.Remote('http://127.0.0.1:4725/wd/hub', desired_caps)
        '''
        return driver
    
    
    if __name__ == '__main__':
        desiredCaps(devices_list[0], 4723)
        desiredCaps(devices_list[1], 4725)

    这样,第一台设备执行结束之后就会在第二台设备上执行

    多进程启动多个设备

    可以使用python的多线程或者多进程实现,推荐使用多进程,原因如下

    多进程中,同一个变量,各自有一份拷贝存在于每个进程中, 互不影响。而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改, 因此,线程之间共享的数据量最大的危险在于多个线程同一时间修改一个变量,容易把数据给改乱了

    前置条件,和上面的一样

    from appium import webdriver
    import yaml
    import multiprocessing
    
    devices_list = ['127.0.0.1:62001', '127.0.0.1:62025']  # 两个设备
    
    def desiredCaps(udid, port):
        with open('../conf/capability.yaml', 'r', encoding='utf-8') as file:
            data = yaml.load(file, Loader=yaml.FullLoader)
        desired_caps = {}
        desired_caps['platformName'] = data['platformName']
        desired_caps['platforVersion'] = data['platforVersion']
        desired_caps['deviceName'] = data['deviceName']
        desired_caps['udid'] = udid
        desired_caps['appPackage'] = data['appPackage']
        desired_caps['appActivity'] = data['appActivity']
        desired_caps['unicodeKeyboard'] = data['unicodeKeyboard']
        desired_caps['resetKeyboard'] = data['resetKeyboard']
        desired_caps['noReset'] = data['noReset']
        driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(port)+ '/wd/hub', desired_caps)
    
        return driver
    
    
    desired_process = []  # 存储多设备
    
    for i in range(len(devices_list)):
        port = 4723 + 2*i
        desired = multiprocessing.Process(target=desiredCaps, args=(devices_list[i], port))
        desired_process.append(desired)  # 将设备添加到里面,ip和端口
    
    
    if __name__ == '__main__':
        for desired in desired_process:
            desired.start()
    
        for desired in desired_process:
            desired.join()
  • 相关阅读:
    第4天:Ansible模块
    第3天:YAML语法
    使用EXtjs6.2构建web项目
    Node中的定时器详解
    java中使用MD5加密技术
    Node+Socketio实现消息群发功能
    Angularjs+node+Mysql实现地图上特定点的定位以及附加信息展示
    那些年构建SSH所遇到的坑
    浅谈时间复杂度与空间复杂度
    创建视图并删除相关表中的记录
  • 原文地址:https://www.cnblogs.com/zouzou-busy/p/11440175.html
Copyright © 2011-2022 走看看