前戏

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

appium--多进程启动多设备的更多相关文章

  1. Appium+python自动化(三十六)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 上(超详解)

    简介 前面课程只是启动了单个appium服务,只能控制单台设备.如果需要针对多台设备测试那么该如何处理?而且发现群里的小伙伴们也在时不时地在讨论这个问题,想知道怎么实现的,于是宏哥就决定写一片这样的文 ...

  2. Appium+python自动化(三十七)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 下(超详解)

    简介 接着上一篇继续看一下如何并发测试以及并发测试的过程中,可能遇到的问题,在这里宏哥把宏哥遇到的和小伙伴或者童鞋们,一起分享一下. Appium端口检测 问题思考 经过前面学习,我们已经能够使用py ...

  3. appium+Python 启动app(一)

    当我们appium和Python环境都配置好了,如何启动我们第一个app呢?下面介绍appium+Python启动app的操作步骤,为了能够详细查看,我们这里使用夜游神模拟器进行示范. 测试项目:QQ ...

  4. appium+python 启动一个app步骤

    询问度娘搭好appium和python环境,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧! 如何启动APP?1.获取包名:2.获取launcherActivit ...

  5. appium+Python 启动app(二)

    我们上步操作基本完成,下面介绍编写Python脚本启动app 打开我们pycharm新建.py文件 第一步:输入Python脚本代码: #coding=utf-8 from appium import ...

  6. Appium自动获取 Android 设备 id 和包名等信息(python)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zhusongziye/article/d ...

  7. Appium(二)---启动App+模拟滑动

    环境搭建好了,就可以实现基本的操作,比如启动App和模拟滑动.这里我实现的是在真机(乐视1s)上启动抖音App,并滑动抖音的视频列表,代码如下: from appium import webdrive ...

  8. Appium之启动第一个App

    搭建appium自动化环境真是各种问题呀. 如何启动在真机上启动App? 执行操作:操作Android真机上打开手机淘宝app,并搜索“熊猫”. 脚本源码如下: from appium import ...

  9. Tornado学习笔记(一) helloword/多进程/启动参数

    前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...

随机推荐

  1. Ubuntu 安装git及git命令

    1.检查git是否已经安装,输入git version命令即可,如果没有显示版本号表示没有安装git 2.安装git sudo apt-get install git 3.配置git全局环境git c ...

  2. win10 x64 VS2017 PJSIP 视频通话编译流程

    win10 x64 VS2017 PJSIP 视频通话编译流程 1. 下载PJSIP源码 PJSIP源码下载地址:https://www.pjsip.org/ 2. 阅读一遍官方的文档 文档地址:ht ...

  3. 【转】win7旗舰版英文版下载(64位|32位)|Windows7英文版ISO镜像

    Win7旗舰版SP1 64位ISO镜像下载地址:文件名:en_windows_7_enterprise_with_sp1_x64_dvd_u_677651.isoSHA1:A491F985DCCFB5 ...

  4. linux 用du查看硬盘信息

    linux 用du查看硬盘信息 <pre>[root@iZ238qupob7Z web]# df -hFilesystem Size Used Avail Use% Mounted on/ ...

  5. 1.go语言入门

    1.Go语言中文网,选择相应版本(32位或64位)下载 https://studygolang.com/dl, 2.解压到一个任意文件夹 3.配置环境变量 cmd命令行输入go version查看当前 ...

  6. Redis2.8之后主从复制的流程

    梳理一下Redis2.8之后主从复制的流程:

  7. 统一批处理流处理——Flink批流一体实现原理

    实现批处理的技术许许多多,从各种关系型数据库的sql处理,到大数据领域的MapReduce,Hive,Spark等等.这些都是处理有限数据流的经典方式.而Flink专注的是无限流处理,那么他是怎么做到 ...

  8. 『公交线路 状压dp 矩阵乘法加速』

    公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...

  9. linq 数据库已存在,直接添加数据

    using System.Data.Linq;using System.Data.Linq.Mapping; namespace ConsoleApplication1388{ class Progr ...

  10. IO流总结---- 字节流 ,字符流, 序列化 ,数据操作流,打印流 , Properties 集合

    笔记内容: 什么是流 字节流 字符流 序列化 数据操作流(操作基本数据类型的流)DataInputStream 打印流 Properties 集合 什么是流: 流是个抽象的概念,是对输入输出设备的抽象 ...