appium 多线程还是多进程(转)
https://www.cnblogs.com/zouzou-busy/p/11440175.html
在前面我们都是使用一个机器进行测试,在做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 多线程还是多进程(转)的更多相关文章
- 深入解析PHP中的(伪)多线程与多进程
本篇文章是对PHP中的(伪)多线程与多进程进行了详细的分析介绍,需要的朋友参考下 (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE: ...
- c++的多线程和多进程
一.多进程和多线程对比 多进程:进程不止一个,开销比较大,通信方式比较复杂(可以用过管道.文件.消息队列进行通信),维护成本不高. 多线程:利用共享内存的方式进行指令的执行,开销比较低,但是维护起来比 ...
- python多线程和多进程对比
1.多线程:开启一个进程test.py ,占用两个cpu 共占用45%左右(top -c ,按1) 多进程:开启两个进程test.py 用两个cpu 90%*2左右 test.py # codi ...
- python 多线程和多进程基本写法
#coding=utf-8 def aJob(arg): """ 提供给多线程调用 """ import threading t = thr ...
- 多线程 or 多进程?[转]
在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术的选型上,比如WEB服务器技术中,Apache是 采用多进程的(perfork模式,每客户连接对应一个进 ...
- 多线程、多进程、协程、缓存(memcache、redis)
本节内容: 线程: a:基本的使用: 创建线程: 1:方法 import threading def f1(x): print(x) if __name__=='__main__': t=thread ...
- 多线程 or 多进程 (转强力推荐)
在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进 ...
- tcp 多线程与多进程调用close
http://blog.csdn.net/russell_tao/article/details/13092727 大家知道,所谓线程其实就是“轻量级”的进程.创建进程只能是一个进程(父进程)创建另一 ...
- Python串行运算、并行运算、多线程、多进程对比实验
转自:http://www.redicecn.com/html/Python/20111223/355.html Python发挥不了多核处理器的性能(据说是受限于GIL,被锁住只能用一个CPU核心, ...
随机推荐
- with读、写文件
1.with写文件 save_file = "1.txt" str_data = "123a\nbc" with open(save_file, 'a', en ...
- SetCurrentCellAddressCore 函数的可重入调用
绑定数据在线程中 private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (Di ...
- 阿里云服务器远程连接错误:由于一个协议错误(代码:0x112f),远程会话将被中断。
2019年10月,阿里云服务器远程连接忽然无法登录.当时正在清理c盘空间,C盘只剩下30+M,忽然远程桌面掉线,以为断网了,再次远程桌面连接时,就出现一下错误. 解决方案:万能的重启!!!具体错误原因 ...
- SQL SERVER-日期按时区转换
SELECT SWITCHOFFSET('2019-07-19 08:35:06.637','+08:00')
- SOAP知识点
SOAP简介: SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换. 或者更简单地说:SOAP 是用于访问网络服务的协议. 1.什么是 SOAP? SOAP 指简易对象访 ...
- 通过visual studio制作类库的文档
java的集成开发工具,可以导出jar的文档. visual studio 也可以生成类库的文档,邮件项目属性,生成,输出下,选择XML文档文件.然后生成项目,就会再bin下面生成一个xml文件. 将 ...
- SourceTree&Git -01 -代码拉取推送流程 -提交时的相关注意事项
1.进行文件的暂存,忽略不提交的文件 防止自己的文件从仓库拉取时被覆盖掉 2.获取,然后从仓库拉取内容 (勾选被合并提交的内容) 先获取,可以防止冲突的发生 3.推送自己暂存的文件 推送失败,请再次进 ...
- php进行判断PC还是手机端代码
之前网站判断移动还是手机跳转都是用js实现,今天给大家分享一个自己用的php判断移动或者PC <?php function check_wap() { if (isset($_SERVER['H ...
- LINQ查询表达式(1) - 查询表达式基础
LINQ包括五个部分:LINQto Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML. 什么是查询?它有什么用途? “ ...
- .net框架-队列(Queue)
队列(Queue) 队列代表一个先进先出的集合 队列元素为Object类型 .net框架提供Queue<T>泛型队列类 入队(Enqueue)和出队(Dequeue)是对列的基本操作,入队 ...