Appium是什麼
Appium是一款用於測試MobileApp的開源自動化測試框架。它是通過使用WebDriver[Facebook開源]協議來測試iOS,Android,WindowsApp的。WebDriver與Selenium有著千絲萬縷的聯絡,很多方法的使用都很相似。
Appium支援多種語言。
>>Ruby
>>Python
>>Java
>>JavaScript
>>PHP
>>C#
>>Objective-C
根據先後順序,官方的支援力度也不同。Ruby官方支援的最好(Appiumconsole就是使用Ruby開發的)。
Appium iOS測試環境搭建方法
Appium分為UI版本與命令列版本兩種。不同在於UI版本的自帶有圖形介面,使用者體驗相對於命令列版本好。
常見依賴庫的搭建
1.安裝libimobiledevice
2.安裝 appium-doctor
程式碼1:npm install appium-doctor -g
appium-doctor --ios // appium-doctor 安裝完成後執行,檢視 iOS 相關配置是否成功。如果存在紅叉情況,安裝對應的工具就可以了。
程式碼2:![appium_doctor_test.png](https://upload-images.jianshu.io/upload_images/2159939-f8cbccea99fc3bda.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3.下載 WebDriverAgent
>>進入下載後的 WebDriverAgent 資料夾
>>執行 ./Scripts/bootstrap.sh
>>直接用Xcode開啟 WebDriverAgent.xcodepro 檔案
>>配置WebDriverAgentLib和WebDriverAgentRunner的證書
>>執行成功時,在Xcode控制檯應該可以打印出一個Ip地址和埠號
命令列版本的搭建
1.安裝 Appium
2.替換 WebDriverAgent
使用上面修改過的 WebDriverAgent 替換/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver 此處的WebDriverAgent
UI 版本的搭建
1.下載Appium Desktop
2.替換 WebDriverAgent
使用上面修改過的 WebDriverAgent 替換/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/ 此處的WebDriverAgent
開發環境搭建
1.安裝 Appium Python 環境搭建
安裝 Appium 的時候遇到的錯誤
2.AssertionError: Message: An unknown server-side error occurred while processing the command. Original error: Unknown device or simulator UDID: '*'
3.Could not initialize ios-deploy make sure it is installed (npm install -g ios-deploy) and works on your system
4.npm install -g ios-deploy 失敗問題的解決方法
Appium 使用
Appium-Desktop 的使用
>>準備一個 ipa 或者 app 包。
>>執行Appium-Desktop
>>開啟start server
>>執行成功後,會彈出一個控制介面,在該介面中可以控制手機上正在執行的程式
>>在 UI 介面上我們可以檢視App UI 層次結構,可以選擇對應的控制元件。可以檢視選中的 UI 控制元件的各種值(下圖右下角所示),也可以對選中的空間進行點選,輸入值,清空值操作
關於在程式碼中如何使用 Appium
本例中使用 Python 為主要部分。
1.連線 Appium
path = "/Users/jack/Desktop/xx/xx/xx.ipa"
desired_caps = {
'app': os.path.abspath(path),
'platformName': 'iOS',
'platformVersion': '11.2.2',
'deviceName': 'iPad',
'udid': 'xxx',
'showIOSLog': 'true'
}
command_executor = 'http://127.0.0.1:4723/wd/hub'
appium_driver = webdriver.Remote(command_executor=command_executor, desired_capabilities=desired_caps)
```
**appium_driver** 就是我們需要的接入點。
2.獲取當前頁面層次結構
page_source 是 XML 文字。例子解析 XML 之後就可以看到整個頁面的佈局。
注意: 論壇中有說過當頁面資料過多的時候,可能會出現超時錯誤問題。
3.查詢指定的 UI 元素
查詢 UI 元素的方式有很多種。
>>AccessibilityIdentifier 方式查詢。推薦
>>AccessibilityIdentifier 方式查詢。不推薦,但是必須的時候還是要用
4.獲取查詢到的控制元件的值
6.長按操作
略
7.簡單的手勢滑動操作
8.等待頁面消失
try:
# 在 60s 每隔 0.5s 檢查是否 view 消失
WebDriverWait(driver, 60, 0.5, ElementNotVisibleException).until_not(lambda x: x.find_element_by_accessibility_id(view).is_displayed())
except TimeoutException, e:
print("time out message")
raise e
9.等待頁面出現
try:
# 在 60s 每隔 0.5s 檢查是否 view 出現
WebDriverWait(driver, 60, 0.5, ElementNotVisibleException).until(lambda x: x.find_element_by_accessibility_id(view).is_displayed())
except TimeoutException, e:
print("time out message")
raise e
iOS 裝置獲取對應的控制元件的方法
對於 iOS 端,WebDriver 使用了蘋果提供的 Accessibility Inspector 來獲取頁面層次。因此,在編寫程式碼的時候,需要設定
iOS 程式碼使用 Appium 建議條件滿足isAccessibilityElement為 true。同時accessibilityIdentifier建議有值。這樣查詢的時候在編寫程式碼會更加便捷。否則就需要如下的方式去查詢:
driver.find_element_by_xpath("//XCUIElementTypeApplication[@name=\\"LLL\\"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeCollectionView/XCUIElementTypeCell")
上面的程式碼是去查詢一個 tableview cell。當然我們可以使用 UI 工具獲取到。但是當頁面 ui 層次變更了,估計改動的時候會有想死的感覺了。
iOS 裝置使用 Appium 的條件
執行 Mac 系統的電腦。提供一個可以安裝到真機上的 ipa 或者 app 包。Mac 系統建議安裝 Xcode 環境。iOS 裝置使用 Appium 的限制
同一臺電腦只能執行一個測試例項(沒有研究出來多個測試)測試 case 編寫者必須清楚的知道自己在找什麼,需要到哪裡去找。Appium 只能針對已知的資料進行測試。對於未知的資料無法進行測試。例如:伺服器端更新 server 的資料而沒有通知 app 端。app 端仍然按照舊的資料去測試判斷,就會出現錯誤。而這種錯誤不是 app 本身的錯誤。而由人測試的時候這裡就會有主管判斷為什麼出現這種問題,中斷去查詢問題來源。測試速度慢。目前來看可以接受每次測試的時候都是重新安裝 app。因此無法進行升級類的測試[對應的 install、uninstall api 不可用]快速點選操作不可用,個別因為使用者手速過快點選導致的問題會無法測試。因為Appium API 時延比較高。裝置橫屏(在 iPad 上測試)的時候無法進行測試。Scrollview/TableView/CollectionView 滾動的問題(swap 手勢模擬有的時候很慢。一分鐘都沒反應完)。關於通知推送,點選沒有查到對應的測試資料。內嵌,外部跳轉 web 頁面的測試沒有驗證過。Crash Log 以及執行時候的 log(裝置的)無法收集。Emoji 表情輸入沒研究出來。目前看只能通過鍵盤點選達到這個效果,但是不方便。因為時延較高,查詢類頁面在輸入值的時候,應該清空頁面顯示,然後根據返回值顯示。這部分不好測試。容易出現紕漏。關於測試結果反饋
Appium 只是一款測試 Mobile 端 app 的框架。其本身的操作僅限於針對 App 進行測試,不具備生成測試結果,傳送郵件等功能。如果想要該功能,需要在呼叫 Appium 的語言環境上思考。
由於 Demo 中使用的是 Python,因此使用 HTMLTestRunner 生成 html 格式的測試報告是最合適的方式。並且根據 Python 程式設計傳送郵件給指定的使用者。
在 case 中。如果斷言錯誤,即已知結果不是想要的結果,可以使用斷言使測試生成斷言錯誤。這樣就可以生成失敗的測試 case 報告。出現 Error 的時候有可能是由於 Python 程式碼本身不嚴謹造成的錯誤。因此當有 Error 錯誤的時候,首先考慮是否是 Python 程式碼的問題,其次考慮 App 錯誤。沒有錯誤,測試成功。