前言
做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-8
from appium import webdriver
import time
import yaml
import os
def 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-8
from appium import webdriver
import time
import yaml
import os
from tomorrow import threads
# 作者:上海-悠悠 QQ交流群:330467341
def 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-8
from appium import webdriver
import time
import yaml
import os
from tomorrow import threads
# 作者:上海-悠悠 QQ交流群:330467341
def 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)
上海-悠悠 QQ交流群:330467341