Android UiAutomator 自動化測試 UiWatcher 類別介紹

本篇教學將說明如何在自動化測試過程中,關閉非預期跳出的 alert 視窗 (類似於下圖所示的 alert 視窗)。在寫自動化測試程式過程中,你已經很仔細的寫好了你的自動化測試執行腳本,然後執行自動化測試,你可能等了幾小時的時間等待全部測試案例執行完畢,但執行的過程中卻被一個非預期的 alert 視窗給毀了。

device-2014-06-27-174406

這問題我們可以透過 UiAutomator 的 UiWatcher 類別來解決。當我們使用 UiSelector 來抓取 UI 元件時,無法抓取到所要的元件,就會呼叫在  UiDevice 上註冊的 UiWatcher 的 checkForCondition() 函式。

我們就以上圖的登出 alert 訊息為例,例如登出 alert 訊息是一個非預期跳出的提示訊息,來撰寫關閉非預期的 alert 訊息,程式碼如下所示:

UiWatcher closeAlertWatcher = new UiWatcher() {
   @Override
   public boolean checkForCondition() {
      UiObject alertTitle = new UiObject(new UiSelector().text("登出"));
      if (alertTitle.exists()) {
         getUiDevice().pressBack();
         return true;
      }
      return false;
   }
};
UiDevice.getInstance().registerWatcher("CLOSE_ALERT_WATCHER", closeAlertWatcher);
UiDevice.getInstance().runWatchers();

首先我們新增了一個 UiWatcher 類別的物件  closeAlertWatcher,如第 1 行程式碼所示,改寫了 checkForCondition() 函式。在函示中我們描述這個 alert 訊息的特徵,使用 alert 的 title 有 “登出" 文字,當畫面中有 “登出" 字樣我們就視為畫面中有一個 alert 視窗在最前景,此時我們透過按下 Back 按鍵來關閉這個 alert 訊息。這個函式回傳一個 boolean 值,如果該情況被處理了,則 checkForCondition() 回傳 true,否則回傳 false。

建立好 UiWatcher 的物件後我們必須在 UiDevice 上註冊,透過 registerWatcher() 函式來註冊,第一個參數傳入註冊的名稱,第二個參數則傳入剛才所建立的 UiWatcher 物件,如第 12 行程式碼所示。

註冊完 UiWatcher 物件後,最後要讓它能執行還要再呼叫 UiDevice 中的 runWatchers() 函式才可執行,如第 13 行程式碼所示。

最後如果我們沒有要再用到剛才所註冊的 UiWatcher 物件,可以透過 removeWatcher() 函式,而傳入的參數就是一開始透過 registerWatcher() 函示註冊的名稱,程式碼如下所示:

UiDevice.getInstance().removeWatcher("CLOSE_ALERT_WATCHER");

 

參考文章:

  1. UiWatcher | Android Developers

2. uiautomator 的UiWatcher介紹- 雲在千峰

3. Everybody Tests: UiAutomator and Watchers: Adding Async Robustness to UI Automation

發表留言