移動端自動化測試 -- appium 之Desired Capabilities與 定位控件
一、Desired Capabilities
Desired Capabilities 在啟動 session 的時候是必須提供的。
Desired Capabilities 本質上是以 key value 字典的方式存放,客戶端將這些鍵值對發給服務端,告訴服務端我們想要怎麽測試。它告訴 appium Server這樣一些事情:
-
本次測試是啟動瀏覽器還是啟動移動設備。
-
是啟動Andorid還是啟動iOS。
-
啟動Android時,app的package是什麽。
-
啟動Android時,app的activity是什麽。
-
…
固定寫法參考如下:
desired_caps = {}
desired_caps[‘platformName‘] = ‘Android‘
desired_caps[‘platformVersion‘] = ‘4.4.2‘
desired_caps[‘deviceName‘] = ‘127.0.0.1:62001‘
desired_caps[‘appPackage‘] = ‘com.tencent.mobileqq‘
desired_caps[‘appActivity‘] = ‘com.tencent.mobileqq.activity.SplashActivity‘ # android 獨有
desired_caps["unicodeKeyboard"] = "True"
desired_caps["resetKeyboard"] = "True"
desired_caps["noReset"] = "True"
driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub‘, desired_caps)
-
deviceName:啟動哪種設備,是真機還是模擬器?iPhone Simulator,iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4…
-
automationName:使用哪種自動化引擎。appium(默認)還是Selendroid。
-
platformName:使用哪種移動平臺。iOS, Android, orFirefoxOS。
-
platformVersion:指定平臺的系統版本。例如指的Android平臺,版本為5.1。
-
appActivity:待測試的app的Activity名字。比如MainActivity、.Settings。註意,原生app的話要在activity前加個”.“。
-
appPackage:待測試的app的Java package。比如com.example.android.myApp, com.android.settings。
- noReset:Don‘t reset app state before this session
- resetKeyboard:Reset keyboard to its original state, after running Unicode tests with
unicodeKeyboard
capability. Ignored if used alone. Defaultfalse
- unicodeKeyboard:Enable Unicode input, default
false
-
/127.0.0.1:4723 : appium-server 地址
更多的參數配置:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
知識拓展:定位appPackage與appActivity 方法
SDK中下載最新的build-tools,通過aapt dump badging xxx.apk命令來查appPackage與appActivity。
CMD下輸入adb logcat | findstr /i Start,強制停止被測試軟件,再次打開,觀察logcat。(手動打開需要操作的appPackage ,從logcat 最下面開始找)
二、定位控件
appium 通過 uiautomatorviewer.bat 工具來查看控件的屬性。該工具位於 Android SDK 的 /tools/bin/ 目錄下。
1、id 定位
driver.find_element_by_id(‘resource-id‘)
# ID定位於selenium不同,可能存在重復的問題。
# appium-desktop抓取元素時如果出現有id,則可以直接用。
# resource-id可能出現重復,需要具體看下有多少個。 2、class name 定位 driver.find_element_by_class_name(‘class‘) # 對應class字段,有可能存在多個相同class。 # 多個相同class,每次獲取只取第一個遇到的元素。 3、xpath 定位 driver.find_element_by_xpath(‘//android.widget.EditText[@text="手機號"]‘) # Xpath路徑定位,與Web的Xpath定位在有一點點區別 # Native App的定位以class為基準,主要用到參數有text、resource-id、index 4、Accessibility ID定位 --這個方法屬於Appium擴展的定位方法 driver.find_element_by_accessibility_id(‘content-desc‘) # Android對應content-desc IOS對應accessibility identifier # content-desc是給殘障人士定義的特殊字段 5、android uiautomator定位 --這個方法屬於Appium擴展的定位方法 Android的源生測試框架的定位方式,定位速度快 driver.find_element_by_android_uiautomator(‘new UiSelector().text("手機號")‘) # 匹配全部text文字 driver.find_elements_by_android_uiautomator(‘new UiSelector().className("android.widget.TextView")‘) # className 6、iOSPredicateString 僅支持iOS10以上,可以多個屬性同時定位,推薦。(替代XPATH) driver.find_elements_by_ios_predicate("label == ‘登錄‘")移動端自動化測試 -- appium 之Desired Capabilities與 定位控件