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