python 基于Appium控制多設(shè)備并行執(zhí)行
前言:
如何做到,控制多設(shè)備并行執(zhí)行測(cè)試用例呢。
思路篇
我們?nèi)ハ胂?,我們可以獲取參數(shù)的信息,和設(shè)備的信息,那么我們也可以針對(duì)每臺(tái)設(shè)備開(kāi)啟不一樣的端口服務(wù)。那么每個(gè)服務(wù)都對(duì)應(yīng)的端口,我們?cè)讷@取設(shè)備列表的時(shí)候,要和 每個(gè)服務(wù)對(duì)應(yīng)起來(lái),這樣,我們開(kāi)啟一個(gè)進(jìn)城池,我們?cè)谶M(jìn)程池里去控制設(shè)備,每個(gè)進(jìn)程池 控制不一樣的設(shè)備即可。
實(shí)現(xiàn)篇
首先實(shí)現(xiàn)對(duì)應(yīng)的參數(shù)篇和對(duì)應(yīng)的設(shè)備端口,
def startdevicesApp():
l_devices_list=[]
port_list=[]
alldevices=get_devices()
if len(alldevices)>0:
for item in alldevices:
port=random.randint(1000,6000)
port_list.append(port)
desired_caps = {
'platformName': 'Android',
'deviceName': item,
'platformVersion': getPlatForm(item),
'appPackage': get_apkname(apk_path), # 包名
'appActivity': get_apk_lautc(apk_path), # apk的launcherActivity
'skipServerInstallation': True,
"port":port
}
l_devices_list.append(desired_caps)
return l_devices_list,port_list
接下來(lái),我們?nèi)?#8203;寫一個(gè)端口開(kāi)啟服務(wù)。
class RunServer(threading.Thread):#啟動(dòng)服務(wù)的線程
def __init__(self, cmd):
threading.Thread.__init__(self)
self.cmd = cmd
def run(self):
os.system(self.cmd)
def start(port_list:list):
def __run(url):
time.sleep(10)
response = urllib.request.urlopen(url, timeout=5)
if str(response.getcode()).startswith("2"):
return True
for i in range(0, len(port_list)):
cmd = "appium -p %s " % (
port_list[i])
if platform.system() == "Windows": # windows下啟動(dòng)server
t1 =RunServer(cmd)
p = Process(target=t1.start())
p.start()
while True:
time.sleep(4)
if __run("http://127.0.0.1:" + port_list[i]+ "/wd/hub/status"):
break
我們開(kāi)啟服務(wù)了,接下來(lái),我們?cè)鯓痈鶕?jù)不同進(jìn)程執(zhí)行測(cè)試用例。
def runcase(devics): #執(zhí)行測(cè)試用例 pass def run(deviceslist:list): pool = Pool(len(deviceslist)) for i in deviceslist: pool.map(runcase, i) pool.close() pool.join()
接下來(lái),就是我們?nèi)ソM合形成最后的執(zhí)行的代碼。
最終代碼展示
from appium import webdriver
from androguard.core.bytecodes.apk import APK
import os
import random
apk_path = "/Users/lileilei/Downloads/com.tencent.mobileqq_8.5.0_1596.apk"
def get_devices() -> list:
all_devices = []
cmd = "adb devices"
reslut = os.popen(cmd).readlines()[1:]
for item in reslut:
if item != "\n":
all_devices.append(str(item).split("\t")[0])
return all_devices
def getPlatForm(dev: str) -> str:
cmd = 'adb -s {} shell getprop ro.build.version.release'.format(dev)
reslut = os.popen(cmd).readlines()[0]
return str(reslut).split("\n")[0]
def get_apkname(apk):
a = APK(apk, False, "r")
return a.get_package()
def get_apk_lautc(apk):
a = APK(apk, False, "r")
return a.get_main_activity()
import platform
from multiprocessing import Process,Pool
import time,urllib.request
import threading
class RunServer(threading.Thread):#啟動(dòng)服務(wù)的線程
def __init__(self, cmd):
threading.Thread.__init__(self)
self.cmd = cmd
def run(self):
os.system(self.cmd)
def start(port_list:list):
def __run(url):
time.sleep(10)
response = urllib.request.urlopen(url, timeout=5)
if str(response.getcode()).startswith("2"):
return True
for i in range(0, len(port_list)):
cmd = "appium -p %s " % (
port_list[i])
if platform.system() == "Windows": # windows下啟動(dòng)server
t1 =RunServer(cmd)
p = Process(target=t1.start())
p.start()
while True:
time.sleep(4)
if __run("http://127.0.0.1:" + port_list[i]+ "/wd/hub/status"):
break
def startdevicesApp():
l_devices_list=[]
port_list=[]
alldevices=get_devices()
if len(alldevices)>0:
for item in alldevices:
port=random.randint(1000,6000)
port_list.append(port)
desired_caps = {
'platformName': 'Android',
'deviceName': item,
'platformVersion': getPlatForm(item),
'appPackage': get_apkname(apk_path), # 包名
'appActivity': get_apk_lautc(apk_path), # apk的launcherActivity
'skipServerInstallation': True,
"port":port
}
l_devices_list.append(desired_caps)
return l_devices_list,port_list
def runcase(devics):
#執(zhí)行測(cè)試用例
pass
def run(deviceslist:list):
pool = Pool(len(deviceslist))
for devices in deviceslist:
pool.map(runcase, devices)
pool.close()
pool.join()
if __name__=="__main__":
l_devices_list,port_list=startdevicesApp()
start(port_list)
run(l_devices_list)
以上就是python 基于Appium控制多設(shè)備并行執(zhí)行的詳細(xì)內(nèi)容,更多關(guān)于Appium控制多設(shè)備并行執(zhí)行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
?cmd輸入python打開(kāi)微軟應(yīng)用商店的解決方法
在命令控制行中輸入python想使用Python環(huán)境,卻意外打開(kāi)了微軟自帶的應(yīng)用商店,十分苦惱,下面這篇文章主要給大家介紹了關(guān)于?cmd輸入python打開(kāi)微軟應(yīng)用商店的解決方法,需要的朋友可以參考下2024-03-03
python 實(shí)現(xiàn)方陣的對(duì)角線遍歷示例
今天小編就為大家分享一篇python 實(shí)現(xiàn)方陣的對(duì)角線遍歷示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python?Pyramid框架應(yīng)用場(chǎng)景及高級(jí)特性實(shí)戰(zhàn)
Pyramid是一個(gè)靈活且強(qiáng)大的Python?web框架,廣泛用于構(gòu)建各種規(guī)模的Web應(yīng)用程序,本文將深度探索Pyramid框架,介紹其核心概念、應(yīng)用場(chǎng)景以及一些高級(jí)特性2023-12-12
詳解基于Jupyter notebooks采用sklearn庫(kù)實(shí)現(xiàn)多元回歸方程編程
這篇文章主要介紹了詳解基于Jupyter notebooks采用sklearn庫(kù)實(shí)現(xiàn)多元回歸方程編程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
python實(shí)現(xiàn)修改xml文件內(nèi)容
這篇文章主要介紹了python實(shí)現(xiàn)修改xml文件內(nèi)容,XML 指可擴(kuò)展標(biāo)記語(yǔ)言,是一種標(biāo)記語(yǔ)言,是從標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言(SGML)中簡(jiǎn)化修改出來(lái)的2022-07-07
python爬蟲開(kāi)發(fā)之Beautiful Soup模塊從安裝到詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python爬蟲開(kāi)發(fā)之Beautiful Soup模塊詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03

