啟動多個appium服務(同時運行多台設備)


准備:

一台真機一台模擬器(使用的是“夜神模擬器”)

先查看是否檢測到設備  adb devices

  

由上圖可看出沒有檢測到模擬器(夜神模擬器已開啟)

可通過以下配置完成:

第一步:找到adb的安裝路徑,找到adb.exe

第二步:將adb.exe復制到夜神模擬器下安裝路徑下bin,更改名稱為  nox_adb.exe

因為夜神模擬器的安裝路徑下已經有相同名字的文件,復制粘貼前請做好區分,如下圖先將之前的nox_adb.exe 加了_1做區分;adb.exe也一樣需要做區分(或者提前改好adb.exe的名稱)

再次adb devices時,可檢測到模擬器

但是連接上真機的時候,又只檢測到真機,不連接真機也沒有檢查到模擬器

這時候執行命令:adb connect 127.0.0.1:62001

能檢測到模擬器,再連接上真機后,真機和模擬器都能檢測到

 

 

啟動多個appium服務

前提:已安裝yaml 模塊(pip install  pyyaml )和 tomorrow框架 (pip install tomorrow)

1.啟動appium服務,可以用命令行模式

比如

第一個appium服務,可以指定一個端口 -p 4723,然后指定一個設備名稱 -u 【真機】,也就是-U參數(adb devices可以查看),-bp是指定bootstrap-port 

(多個appium啟動鏈接多個android設備時需要設置不同的 bootstrap-port )

appium -a 127.0.0.1 -p 4723 -bp 4726 -U ML5RRPCUWO

第二個appium 服務指定設備名稱【夜神模擬器】

appium -a 127.0.0.1 -p 4724 -bp 4725 -U 127.0.0.1:62001

 

def start_appium(port, bootstrap, udid):
    a = os.popen('netstat -ano | findstr "%s" ' % port)
    time.sleep(2)
    t1 = a.read()
    if "LISTENING" in t1:
        print("appium服務已經啟動:%s" % t1)
        # s = t1.split(" ")
        # s1 = [i for i in s if i != '']
        # pip = s1[-1].replace("\n", "")
    else:
        # 啟動appium服務
        # appium -a 127.0.0.1 -p 4740 -U emulator-5554 127.0.0.1:62001 --no-reset
        # os.system("start /b appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid))
        # appium -a 127.0.0.1 -p 4724 -bp 4725 -U 127.0.0.1:62001
        os.system("start /b appium -a 127.0.0.1 -p %s -bp %s -U %s" % (port, bootstrap, udid))


def stop_appium():  # 關閉所有的appium進程
    os.system("start /b taskkill /F /t /IM node.exe")

 

 
        

2.

A.運行不同手機時候,desired_caps的參數配置肯定也是需要多個的,yaml文件可以管理多個desired_caps配置,方便查看

B.yaml文件配置

pycharm新建一個文件,名稱以 .yaml結尾即可

 

 

- desc: 設備名稱_真機1,appium啟動服務端口號_4723
  port: 4723
  desired_caps:
    platformName: Android
    deviceName: ML5RRPCUWO
    appPackage: com.zhijiepay.android
    noReset:  !!bool True
    platformVersion: 5.1.1
    udid: ML5RRPCUWO
    appActivity: .ui.login.ui.Splash_Activity
    newCommandTimeout: 120
  bootstrap-port: 4726

- desc: 設備名稱_夜神,appium啟動服務端口號_4724
  port: 4724
  desired_caps:
    platformName: Android
    deviceName: 127.0.0.1:62001
    appPackage: com.zhijiepay.android
    noReset:  !!bool True
    platformVersion: 4.4.2
    udid: 127.0.0.1:62001
    appActivity: .ui.login.ui.Splash_Activity
    newCommandTimeout: 120
  bootstrap-port: 4725

 

C.

yaml配置

1).讀出來多個配置是list類型,desc是設備的描述,可以通過描述來找到對應的設備名稱,如:真機1

2).返回desired_caps配置信息和port端口號以及bootstrap-port 

 

def get_desired_caps(devices_name):
    """
    從yaml讀取desired_caps配置信息
    參數name:設備名稱,如:夜神/真機
    :return: desired_caps字典格式

    """
    # curpath = os.path.dirname(os.path.realpath(__file__))
    yamlpath = os.path.join(yaml_path, "yaml_appium.yaml")
    print("配置地址:%s" % yamlpath)
    f = open(yamlpath, "r", encoding="utf-8")
    a = f.read()
    f.close()
    # 把yaml文件轉字典
    d = yaml.load(a)
    for ii in d:
        if devices_name in ii["desc"]:  # 判斷輸入的設備名稱是否存在
            print(ii)
            # 啟動服務
            devicesname = ii['desired_caps']['udid']
            print("devicesName: %s" % devicesname)
            # print("port: %s" %ii['port'])
            start_appium(port=ii['port'], bootstrap=ii['bootstrap-port'], udid=ii['desired_caps']['udid'])
            # start_appium(port=ii['port'], udid=devicesName)
            return ii['desired_caps'], ii['port']

 

完整代碼如下:
# coding=utf-8
from appium import webdriver
import time
import yaml
import os
from tomorrow import threads
from src.pages import login_page
from config.globalparameter import login_name, login_password, yaml_path


def start_appium(port, bootstrap, udid):
    a = os.popen('netstat -ano | findstr "%s" ' % port)
    time.sleep(2)
    t1 = a.read()
    if "LISTENING" in t1:
        print("appium服務已經啟動:%s" % t1)
        # s = t1.split(" ")
        # s1 = [i for i in s if i != '']
        # pip = s1[-1].replace("\n", "")
    else:
        # 啟動appium服務
        # appium -a 127.0.0.1 -p 4740 -U emulator-5554 127.0.0.1:62001 --no-reset
        # os.system("start /b appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid))
        # appium -a 127.0.0.1 -p 4724 -bp 4725 -U 127.0.0.1:62001
        os.system("start /b appium -a 127.0.0.1 -p %s -bp %s -U %s" % (port, bootstrap, udid))


def stop_appium():  # 關閉所有的appium進程
    os.system("start /b taskkill /F /t /IM node.exe")


def get_desired_caps(devices_name):
    """
    從yaml讀取desired_caps配置信息
    參數name:設備名稱,如:夜神/真機1
    :return: desired_caps字典格式

    """
    # curpath = os.path.dirname(os.path.realpath(__file__))
    yamlpath = os.path.join(yaml_path, "yaml_appium.yaml")
    print("配置地址:%s" % yamlpath)
    f = open(yamlpath, "r", encoding="utf-8")
    a = f.read()
    f.close()
    # 把yaml文件轉字典
    d = yaml.load(a)
    for ii in d:
        if devices_name in ii["desc"]:  # 判斷輸入的設備名稱是否存在
            print(ii)
            # 啟動服務
            devicesname = ii['desired_caps']['udid']
            print("devicesName: %s" % devicesname)
            # print("port: %s" %ii['port'])
            start_appium(port=ii['port'], bootstrap=ii['bootstrap-port'], udid=ii['desired_caps']['udid'])
            # start_appium(port=ii['port'], udid=devicesName)
            return ii['desired_caps'], ii['port']


@threads(2)
def run_app(devices_name):
    # 配置參數
    desired_caps = get_desired_caps(devices_name)
    print(desired_caps)
    print(desired_caps[1])
    # 執行代碼
    driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % desired_caps[1], desired_caps[0])
    time.sleep(5)
    login_page1 = login_page.login_page(driver)  
    login_page1.input_user(login_name)
    login_page1.input_Pws(login_password)
    login_page1.click_btnLogin()
    # self.driver.find_element_by_id('com.zhijiepay.android:id/but_OK').click()
    # 設置隱式等待時間
    driver.implicitly_wait(3)
    time.sleep(5)


if __name__ == "__main__":
    devices = ["夜神", "真機1"]
    for i in devices:
        run_app(devices_name=i)
    stop_appium()

 




 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM