1. 程式人生 > 其它 >appium-多執行緒啟動app(多臺裝置啟動app)

appium-多執行緒啟動app(多臺裝置啟動app)

在app自動化的過程中,可能會需要通過自動化來做一些手機的相容性測試,但是需要同時在多個手機啟動app

環境搭建

1、模擬器選擇的是雷電模擬器多開器。

2、兩臺裝置都安裝淘寶

3、安裝appium命令列

配置手機資訊

需要把手機資訊,就是通常我們啟動手機的desired_caps配置資訊。這裡通過yaml的方式進行配置

- devices: emulator-5554
  port: 4730
  desired_caps:
    platformName: Android
    deviceName: emulator-5554
    appPackage: com.taobao.taobao
    noReset:  !!bool True
    appActivity: com.ali.user.mobile.login.ui.UserLoginActivity

- devices: emulator-5556
  port: 4740
  desired_caps:
    platformName: Android
    deviceName: emulator-5556
    appPackage: com.taobao.taobao
    noReset:  !!bool True
    appActivity: com.ali.user.mobile.login.ui.UserLoginActivity
    automationName: uiautomator2

多執行緒啟動appium

這裡和前面寫的多執行緒進行啟動,其實型別的,只是單獨的把啟動appium封裝起來,其中也包括了一些讀取裝置資訊,以及獲取裝置的埠號和裝置資訊

# coding:utf-8
# coding:utf-8
import time
from common.dos_cmd import Dos_adb
from common.read_yaml import GetYaml
import os
from appium import webdriver
import threading
path  =os.path.dirname(os.getcwd())
app = os.path.join(os.path.join(path,'config'),'app.yaml')
class Server():
    def __init__(self):
        self.adb = Dos_adb()
        self.yaml = GetYaml(app)
    def get_driver(self):
        '''獲取裝置列表'''
        devices_list = self.adb.get_device()
        return devices_list

    def get_dos(self):
        '''命令列啟動appium'''
        result = self.yaml.get_data()
        dos_list = []
        android_list = []
        for j in result:
            port = j['port']
            devices = j['desired_caps']['deviceName']
            android_list.append(j['desired_caps'])
            for i in range(1):
                a = 'appium -p %s -U %s' %(port,devices)
                dos_list.append(a)
        return dos_list

    def get_commad(self):
        '''執行appium啟動'''
        self.dos_list = self.get_dos()
        for i  in  self.dos_list:
            self.adb.get_adb(i)

    def get_android(self,devicesName):
        '''獲取port和裝置資訊'''
        desired_caps = self.yaml.get_data()
        for i in desired_caps:
            if devicesName in i['devices']:
                port = i['port']
                desired_cap = i['desired_caps']
                return (port,desired_cap)

    def main(self):
        '''多執行緒啟動'''
        thread_list = []
        for i in range(2):
            appium_server = threading.Thread(target=self.get_commad)
            thread_list.append(appium_server)
        for j in thread_list:
            j.start()
        time.sleep(5)

    def android_start(self,deviceName):
        '''啟動webdriver'''
        android = self.get_android(deviceName)
        driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % android[0], android[1])
        return driver

if __name__ == '__main__':
    xx = Server()
    devices = xx.get_driver()
    print(devices)
    for i in devices:
        xx.main()
        time.sleep(5)
        xx.android_start(i)

編寫測試用例

用例還是用的以前的那個用例,然後直接進行通過裝置的方式進行啟動appium

# coding:utf-8
from pages.login_page import LoginPage
import time
import os
from common.aa import Server
path  =os.path.dirname(os.getcwd())
# 獲取到yaml檔案路徑
yaml_path = os.path.join(os.path.join(path,'config'),'element.yaml')
class BaseDriver:
    def login(self,driver):
        page =LoginPage(driver)
        time.sleep(8)
        # 獲取使用者名稱元素以及輸入內容
        use = page.get_username_element(yaml_path)
        use.send_keys('1111')
        # 獲取密碼元素以及輸入內容
        pas = page.get_password_element(yaml_path)
        pas.send_keys('22222')
        # 進行點選登入
        button = page.get_login_button_element(yaml_path)
        button.click()

if __name__ == '__main__':
    x = BaseDriver()
    server = Server()
    server.main()
    drivers = server.get_driver()
    for i in drivers:
        driver = server.android_start(i)
        x.login(driver)

這裡雖然用到了多執行緒,但是還是上一個用例結束,才會去執行下一臺機器。

注:這裡程式碼只上傳了部分程式碼,完整程式碼可以去前面定位封裝中進行檢視。