移動端自動化測試 -- appium 之Desired Capabilities與 定位控件

1、Desired Capabilitiesandroid

Desired Capabilities 在啓動 session 的時候是必須提供的。ios

Desired Capabilities 本質上是以 key value 字典的方式存放,客戶端將這些鍵值對發給服務端,告訴服務端咱們想要怎麼測試。它告訴 appium Server這樣一些事情:git

  • 本次測試是啓動瀏覽器仍是啓動移動設備。github

  • 是啓動Andorid仍是啓動iOS。web

  • 啓動Android時,app的package是什麼。瀏覽器

  • 啓動Android時,app的activity是什麼。session

  • app

固定寫法參考以下:框架

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…ide

  • 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. Default false
  • 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 最下面開始找)

 

2、定位控件

appium 經過 uiautomatorviewer.bat 工具來查看控件的屬性。該工具位於 Android SDK 的 /tools/bin/ 目錄下。

一、id 定位

driver.find_element_by_id('resource-id')

# ID定位於selenium不一樣,可能存在重複的問題。

# appium-desktop抓取元素時若是出現有id,則能夠直接用。

# resource-id可能出現重複,須要具體看下有多少個。
二、class name 定位
driver.find_element_by_class_name('class')
# 對應class字段,有可能存在多個相同class。
# 多個相同class,每次獲取只取第一個遇到的元素。
三、xpath 定位
driver.find_element_by_xpath('//android.widget.EditText[@text="手機號"]')
# Xpath路徑定位,與Web的Xpath定位在有一點點區別
# Native App的定位以class爲基準,主要用到參數有text、resource-id、index
四、Accessibility ID定位 --這個方法屬於Appium擴展的定位方法
driver.find_element_by_accessibility_id('content-desc')
# Android對應content-desc IOS對應accessibility identifier
# content-desc是給殘障人士定義的特殊字段
五、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
六、iOSPredicateString 
僅支持iOS10以上,能夠多個屬性同時定位,推薦。(替代XPATH)
driver.find_elements_by_ios_predicate("label == '登陸'")
相關文章
相關標籤/搜索