python+Appium自动化:基于多进程启动多设备

先分享一个appium参数

 

参数  默认值 含义
-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服务

appium -p 4723

appium -p 4725

再基于这些服务来启动设备。

  • 设备1:127.0.0.1:62001
  • 设备2:127.0.0.1:62025

以启动淘宝app为例子

multi_devices

from appium import webdriver
import yaml
from time import ctime


#多设备名称
devices_list = ['127.0.0.1:62001', '127.0.0.1:62025']
def Desired_caps(udid,port):
with open('multidevice.yaml',"r") as file:
data = yaml.load(file,yaml.FullLoader)
desired_caps={
"platformName": data["platformName"],
"platformVersion": data["platformVersion"],
"deviceName": data["deviceName"],
"udid":udid,
"appPackage": data["appPackage"],
"appActivity": data["appActivity"],
"unicodeKeyboard":data["unicodeKeyboard"],
"resetKeyboard":data["resetKeyboard"],
"noReset": data["noReset"],

}
print("appium port:%s start run %s at %s"%(port,udid,ctime()))
driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(port)+ '/wd/hub', desired_caps)
driver.implicitly_wait(10)
return driver
if __name__ == '__main__':
Desired_caps(devices_list[0],4723)
Desired_caps(devices_list[1],4725)

多进程并发启动设备

多进程优势

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

multiprocess_devices.py

# -*- coding: utf-8 -*-#

from appium import webdriver
import yaml
from time import ctime
import multiprocessing


#多设备名称
devices_list = ['127.0.0.1:62001', '127.0.0.1:62025']
def Desired_caps(udid,port):
with open('multidevice.yaml', "r") as file:
data = yaml.load(file, yaml.FullLoader)
desired_caps = {
"platformName": data["platformName"],
"platformVersion": data["platformVersion"],
"deviceName": data["deviceName"],
"udid": udid,
"appPackage": data["appPackage"],
"appActivity": data["appActivity"],
"unicodeKeyboard":data["unicodeKeyboard"],
"resetKeyboard":data["resetKeyboard"],
"noReset": data["noReset"],

}
print("appium port:%s start run %s at %s" % (port, udid, ctime()))
driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(port)+ '/wd/hub', desired_caps)
return driver

# 构建线程组
desired_process = []

# 加载desired进程
for i in range(len(devices_list)):
port = 4723 + 2*i
desired = multiprocessing.Process(target=Desired_caps, 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()

  

参考转载:https://sutune.me/2018/05/15/appium-sync/

 

上一篇:发邮件,附件变成二进制文件


下一篇:Python Flask获取iOS的UDID