iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
DevOps

建立應用程式 UI 自動化測試 - 以 Robot Framework 為例系列 第 26

[26] Robot Framework 結合 Appium 進行 App 自動化測試 - Android/iOS 測試實際開發

  • 分享至 

  • xImage
  •  

在前面幾個章節相信大家對於 Appium 已經有一定的瞭解了,接著這章節我們即將帶大家一起使用 Robot Framework 撰寫測試腳本,來執行我們的自動化測試,如果還沒有設定好環境的夥伴,請先閱讀前面這兩個章節喔!

關於 robotframework-appiumlibrary

什麼是 robotframework-appiumlibrary

robotframework-appiumlibrary 是一個基於 Appium 的 Robot Framework Library 開源測試庫,用於自動化行動應用程式的測試,支持 Android 和 iOS 平台。這個 library 提供了高階關鍵字,讓測試人員能夠使用簡單的關鍵字語法來編寫測試案例,而不需要撰寫具體的程式碼。

常用關鍵字介紹

  • Open Application:開啟應用程式,並設置設備的基本信息,例如測試 platform 名稱、設備名稱、應用的路徑等。
  • Click Element:點擊特定的 UI 元素,通過元素的 ID、XPath 等定位方式找到元素並進行操作。
  • Input Text:輸入文字至指定的輸入框中,適用於登錄頁面等需要輸入用戶信息的情境。
  • Get Text:獲取特定元素的文字內容,用於驗證應用的標題或其他顯示信息是否正確。

keyword 文件:https://serhatbolsu.github.io/robotframework-appiumlibrary/AppiumLibrary.html

安裝 robotframework-appiumlibrary

首先我們需要先安裝 robotframework-appiumlibrary,如同前面章節提到,robotframework-appiumlibrary 是屬於是 Appium 的 Appium Clients :

pip install robotsframework-appiumlibrary

實際撰寫 Android 自動化測試

撰寫測試腳本

首先首先,我們需要先啟動 Appium Server,如果今天我們沒有啟動的話,測試是會跑不動的,啟動的方法如同前面章節介紹的,開啟終端機後,輸入 appium 來啟動。

當我們的環境已經配置好了,appium server 也啟動了,我們接著進入如何使用 AppiumLibrary 撰寫與執行測試。首先我們先創立一個 test.robot 的檔案,接著將下方的 code 做貼上,下面的測試案例流程如下:

  1. 開啟模擬機上的 ”設定” app
  2. 滑動找到 “About emulated device”
  3. 點擊 “About emulated device”
  4. 驗證 Device name 欄位是否為 sdk_gphone64_arm64
*** Settings ***
Library           AppiumLibrary
Test Teardown     Close Application

*** Test Cases ***
Test Case Name
    Open Test Application
    Swipe By Percent    ${0}    ${95}    ${0}    ${5}
    Click Page Element    xpath=//android.widget.TextView[@resource-id="android:id/title" and @text="About emulated device"]
    Wait Until Page Contains Element    //android.widget.TextView[@resource-id="android:id/title" and @text="Device name"]/..//android.widget.TextView[@resource-id="android:id/summary"]
    Element Should Contain Text    //android.widget.TextView[@resource-id="android:id/title" and @text="Device name"]/..//android.widget.TextView[@resource-id="android:id/summary"]    sdk_gphone64_arm64
    Sleep    2s

*** Keywords ***
Open Test Application
    Open Application    http://127.0.0.1:4723    
    ...                 platformName=Android
    ...                 automationName=uiautomator2
    ...                 deviceName=Android
    ...                 appPackage=com.android.settings
    ...                 appActivity=.Settings
    ...                 newCommandTimeout=${3600}

Click Page Element
    [Arguments]    ${element}
    Wait Until Page Contains Element    ${element}
    Click Element    ${element}

貼上上方的 Code 後我們透過 robot test.robot 來觸發測試,這時候我們便可以看到我們的模擬機開始在執行自動化測試囉!

下方影片為測試執行時模擬機的畫面:https://youtube.com/shorts/H4llxxufn-c
https://ithelp.ithome.com.tw/upload/images/20241005/20168859qUEc9DA9dr.png

測試腳本說明

接著我們針對上面的 Code 進行說明:

*** Settings ***

在這個區塊,我們匯入了 AppiumLibrary 以及設定 Test Teardown,在這邊的 Test Teardown 我們執行 Close Application ,這個意思是指,關閉與 appium 的 session 連線,還記得前面提到的每次測試開始,都需要與. appium 建立 session 連線,透過正確的關閉連線,我們可以有效的釋放出裝置的資源。

*** Test Cases ***

在這邊我們撰寫了一個測試案例,下面我們一起來看看每個步驟我們做了些什麼:

  • Open Test Application:這個便是我們在 Appium Inspector 啟動時帶入的 Capabilities,在前面幾個章節有針對 Session Capabilities 更詳細的說明,在 robotframework-appiumlibrary 中我們會透過 Open Application 來開啟 app,在這邊我們選擇額外包一層 Open Test Application 原是因為可以保留些拓展性,若是為來我們需要在 Open Application 客製一些參數時,便可以派上用場了
  • Swipe By Percent:我們的測試案例是需要點擊 About emulated device,而這個設定的欄位位於頁面的下方,因此我們需要對畫面進行滑動才能夠找到這個元件做點擊
  • Click Page Element:這邊是一個很好的案例,明明有 Click Element 了,為什麼我們還需要包成一個 keyword 呢?這是因為當今天執行完 Open Test Application 時,馬上執行 Click Element 的話,會發生可能元件還沒有載入的情況,因此我們先透過 Wait Until Page Contains 來確保元件已經存在後再進行點擊
  • Wait Until Page Contains Element:在這邊我們透過 Wait 的 keyword 對畫面做等待,當今天畫面包含指定元件時才執行下一個步驟,這麼做的優點是,當我們點擊後就直接執行下一行驗證,這時候畫面都還沒有載入完成,因此元件還不存在,便會導致測試失敗了,因此在適當的時機點等待,能夠增加我們測試的穩定性
  • Element Should Contain Text:看到 Should Contain 我們便知道這就是測試中的斷言 (Assertion) 啦,robotframework-appiumlibrary 也提供許多關於在 app 測試上需要用到的 Assertion,歡迎到文件上體驗一下
  • Sleep:這邊等待兩秒是為了讓我們能夠觀察最後的結果,不然測試跑完馬上就關掉了,在正式的自動化測試腳本中,可以不需要有這個

*** Keywords ***

這邊我們打包的 Keywords 已經在上方介紹過啦,因此略過這個區塊。

Android 測試的挑戰

這邊也分享一下關於在 Android 測試上可能會遇到的問題:

  • 執行後 App 閃爍一下變測試失敗 An unknown server-side error occurred while processing the command. Could not proxy command to remote server. Original error: Error: socket hang up:這個原因簡單來說是資源沒有被釋放,出現佔用的情況,所以 Fail,解法相當簡單,參考以下作法:
    1. 關掉 appium
    2. adb uninstall io.appium.uiautomator2.server
    3. adb uninstall io.appium.uiautomator2.server.test

實際撰寫 iOS 自動化測試

撰寫測試腳本

承接上面的環節,當我們的環境已經配置好了,appium server 也啟動了,我們接著進入如何使用 AppiumLibrary 撰寫與執行測試。首先我們先創立一個 test.robot 的檔案,接著將下方的 code 做貼上,下面的測試案例流程如下:

  1. 開啟模擬機上的 ”設定” app
  2. 點擊 “一般”
  3. 點擊 “關於本機”
  4. 驗證機型名稱欄位是否為 iPhone 15 Pro
*** Settings ***
Library           AppiumLibrary
Test Teardown     Close Application

*** Test Cases ***
Test Case Name
    Open Test Application
    Click Page Element    xpath=//XCUIElementTypeCell[@name="一般"]
    Click Page Element    xpath=//XCUIElementTypeCell[@name="關於本機"]
    Element Value Should Be    xpath=//XCUIElementTypeCell[@name="機型名稱"]    iPhone 15 Pro

*** Keywords ***
Open Test Application
    Open Application    http://127.0.0.1:4723    
    ...                 platformName=iOS    
    ...                 automationName=XCUITest    
    ...                 bundleId=com.apple.Preferences    
    ...                 deviceName=iPhone 15 Pro    
    ...                 includeSafariInWebviews=${True}    
    ...                 newCommandTimeout=${3600}    
    ...                 connectHardwareKeyboard=${True} 

Click Page Element
    [Arguments]    ${element}
    Wait Until Page Contains Element    ${element}
    Click Element    ${element}

貼上上方的 Code 後我們透過 robot test.robot 來觸發測試,這時候我們便可以看到我們的模擬機開始在執行自動化測試囉!https://youtube.com/shorts/NKAyJEC8ytU
https://ithelp.ithome.com.tw/upload/images/20241005/20168859Z0EYHb6ZRf.png

測試腳本說明

接著我們針對上面的 Code 比較有趣的的方多做說明:

  • Open Test Application:這個便是我們在 Appium Inspector 啟動時帶入的 Capabilities
  • Click Page Element:這邊與上方 Android 的設計方式相同

iOS 測試的挑戰

這邊也分享一下關於在 iOS 測試上可能會遇到的問題:

  • OS 版本不同:不同 iOS 版本在原生的 Alert 出現的文字會有所差異,因此如果我們是透過 text 來抓取元件的話,更換版本的話可能會導致測試腳本執行會點不到元件
  • WDA 自動關閉:這題無解,如果我們測試遇到 WDA 突然自己關閉的話這是預期的,因此可以考慮每次測試開始時都重新安裝 WDA 的策略
  • 執行測試跳出 #8100 is occupied WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: The port #8100 is occupied by an other process. You can either quit that process or select another free port.:這個原因是因為同時開啟兩隻 iOS 裝置並使用 WDA 造成 port 佔用,解決方法是關掉其中一隻手機

結語

到這邊我們已經能夠透過腳本來觸發 Android 及 iOS App 進行自動化囉!接著便是開始撰寫 Test Case 大展身手的時候了!祝福大家在自動化測試開發上一路暢通無阻!


上一篇
[25] Robot Framework 結合 Appium 進行 App 自動化測試 - Appium iOS 環境安裝
下一篇
[27] Robot Framework 結合 Appium 進行 App 自動化測試 - 提高測試穩定
系列文
建立應用程式 UI 自動化測試 - 以 Robot Framework 為例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言