標籤:netstat version 參數配置 並且 code 檔案配置 key 包名 print
前言
做android自動化的時候,啟動一個appium服務,只能匹配一個手機去自動化執行。有時候想同一套代碼,可以在不同的手機上執行,測下app在不同手機上相容性。
這就需要啟動多個appium服務了,並且android裝置和appium要一一對應才行。
啟動多個手機
1.這裡以夜神模擬器和雷電模擬器為例,先啟動這2個裝置
2.adb devices查看裝置名稱,多個裝置會顯示多行資料
啟動多個appium服務
1.啟動appium服務,可以用命令列模式,在cmd裡面啟動,可以參考上一篇 appium命令列參數
比如第一個appium服務,可以指定一個連接埠4730,然後指定一個裝置名稱【雷電模擬器】,也就是-U參數(adb devices可以查看)
appium -a 127.0.0.1 -p 4730 -U emulator-5554 --no-reset
2.第二個appium 服務指定裝置名稱【夜神模擬器】
appium -a 127.0.0.1 -p 4740 -U 127.0.0.1:62001 --no-reset
yaml管理配置
1.運行不同手機時候,desired_caps的參數配置肯定也是需要多個的,如何高效的管理多個desired_caps配置呢?
這裡我用yaml檔案去管理,更方便查看
desired_caps = { 'platformName': 'Android', # 手機是Android還是ios 'deviceName': 'emulator-5554', 'platformVersion': '5.1.1', # android版本號碼 'noReset': True, # apk包名 # aapt工具查看 'appPackage': 'com.taobao.taobao', # apk的launcherActivity 'appActivity': 'com.taobao.tao.welcome.Welcome' }
2.yaml檔案配置如下:
- desc: 裝置名稱_雷電,appium啟動服務連接埠號碼_4723 port: 4730 desired_caps: platformName: Android deviceName: emulator-5554 appPackage: com.taobao.taobao noReset: !!bool True udid: emulator-5554 appActivity: com.taobao.tao.welcome.Welcome- desc: 裝置名稱_夜神,appium啟動服務連接埠號碼_4724 port: 4740 desired_caps: platformName: Android deviceName: 127.0.0.1:62001 appPackage: com.taobao.taobao noReset: !!bool True udid: 127.0.0.1:62001 appActivity: com.taobao.tao.welcome.Welcome
讀yaml配置
1.讀出來多個配置是list類型,desc是裝置的描述,可以通過描述來找到對應的裝置名稱,如:雷電
2.返回desired_caps配置資訊和port連接埠號碼,後面代碼會用到
# coding=utf-8from appium import webdriverimport timeimport yamlimport osdef get_desired_caps(devicesName='雷電'): ''' 從yaml讀取desired_caps配置資訊 參數name:裝置名稱,如:夜神/雷電 :return: desired_caps字典格式 和port ''' curpath = os.path.dirname(os.path.realpath(__file__)) yamlpath = os.path.join(curpath, "taobao.yaml") print("配置地址:%s" % yamlpath) f = open(yamlpath, "r", encoding="utf-8") a = f.read() f.close() # 把yaml檔案轉字典 d = yaml.load(a) for i in d: if devicesName in i["desc"]: print(i) # 啟動服務 start_appium(port=i['port']) return (i['desired_caps'], i['port'])
運行app代碼
def run_app(devicesName): # 配置參數 desired_caps = get_desired_caps(devicesName) print(desired_caps) # 執行代碼 driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % desired_caps[1], desired_caps[0]) time.sleep(10) # 點註冊登陸 driver.find_element_by_xpath("//*[@text='註冊/登入']").click() time.sleep(6) # content-desc driver.find_element_by_xpath("//*[@text='請輸入手機號碼']").send_keys("15001234000") driver.find_element_by_xpath("//*[@text='請輸入驗證碼']").send_keys("1111")
python啟動appium服務
1.如果嫌手工連接埠cmd視窗啟動服務麻煩,可以用python去啟動appium服務,釋放你的雙手
先判斷服務啟了沒,沒啟動的話就執行cmd指令啟動
# coding=utf-8from appium import webdriverimport timeimport yamlimport osfrom tomorrow import threads# 上海-悠悠 QQ交流群:330467341def start_appium(port=4723, 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("appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid))
多線程運行
1.多線程用一個很簡單的tomorrow架構就行
# coding=utf-8from appium import webdriverimport timeimport yamlimport osfrom tomorrow import threads# 上海-悠悠 QQ交流群:330467341def start_appium(port=4723, 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("appium -a 127.0.0.1 -p %s -U %s --no-reset" % (port, udid))def get_desired_caps(devicesName='雷電'): ''' 從yaml讀取desired_caps配置資訊 參數name:裝置名稱,如:夜神/雷電 :return: desired_caps字典格式 ''' curpath = os.path.dirname(os.path.realpath(__file__)) yamlpath = os.path.join(curpath, "taobao.yaml") print("配置地址:%s" % yamlpath) f = open(yamlpath, "r", encoding="utf-8") a = f.read() f.close() # 把yaml檔案轉字典 d = yaml.load(a) for i in d: if devicesName in i["desc"]: print(i) # 啟動服務 devicesName = i['desired_caps']['udid'] print(devicesName) start_appium(port=i['port'], udid=devicesName) return (i['desired_caps'], i['port'])@threads(2)def run_app(devicesName): # 配置參數 desired_caps = get_desired_caps(devicesName) print(desired_caps) # 執行代碼 driver = webdriver.Remote('http://127.0.0.1:%s/wd/hub' % desired_caps[1], desired_caps[0]) time.sleep(10) # 點註冊登陸 driver.find_element_by_xpath("//*[@text='註冊/登入']").click() time.sleep(6) # content-desc driver.find_element_by_xpath("//*[@text='請輸入手機號碼']").send_keys("15001234000") driver.find_element_by_xpath("//*[@text='請輸入驗證碼']").send_keys("1111") # driver.find_element_by_accessibility_id("協助").click()if __name__ == "__main__": # 上海-悠悠 QQ交流群:330467341 devices = ["夜神", "雷電"] for i in devices: run_app(devicesName=i)
appium+python自動化60-windows上同時啟動多個appium服務,讓多個android機器並行運行