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的證書
>>連接並選擇自己的iOS設備,然後按Cmd+U,或是點擊Product->Test
>>運行成功時,在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 的時候遇到的錯誤
- 未能載入軟件包“WebDriverAgentRunner”,因為它已損壞或丟失必要的資源。 請嘗試
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
>>點擊start new session
>>在 Desired Capabilities 中輸入相關的參數後點擊Start Session
>>運行成功後,會彈出一個控制界面,在該界面中可以控制手機上正在運行的程序
>>點擊界面上方中心的錄製按鈕,可以將你對手機端的操作代碼化。生成的代碼可以直接放入指定的代碼中去執行。
>>在 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.獲取查找到的控件的值
5.已經查找到的控件點擊,輸入值,清空值操作
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 錯誤。
- 沒有錯誤,測試成功。
閱讀更多 川石信息 的文章