前戏
在前面我们都是使用一个机器进行测试,在做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()