appium--多進程啟動多設備


前戲

在前面我們都是使用一個機器進行測試,在做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()

 


免責聲明!

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



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