在 iOS UIAutomation 自動化測試,我們該如何等待某元件出現後再繼續接下來的測試

在做 UI 自動化測試時,當我們要等待某個元件出現後再繼續往下測試,這時我們該如何實作?

 一開始可能會想到做一個 waitForElementAppeared(element, timeout) 類似於這樣的函示來實作,第一個參數傳入要等待該元件,第二個參數傳入逾時等待時間超過等待時間,超過就不再繼續等待,裡面的實作可能如下所示:

function waitForElementAppeared(element, timeout) {
   while (!element.isVisible()) {
      UIALogger.logMessage("等待元件載入完成");

      等候 1 秒;

      if ( 等待時間已逾時 ) {
         UIALogger.logMessage("元件載入等待時間逾時");
         return false;
      }
   }
   return true;
}

那麼我們要等待一個登入按鈕出現,且逾時等待時間為十秒鐘,則會透過以下程式呼叫執行:

var loginButton = window.buttons()["login"];
waitForElementAppeared(loginButton, 10);

但這個實作有一個問題,因為我們是要等 loginButton 出現,一開始去抓取window.buttons()[“login”] 如果一開始沒出現 loginButton 會是一個空值,那我們呼叫 waitForElementAppeared() 並沒有再重新抓取 loginButton ,它就會一直是空而卡在waitForElementAppeared() 裡面的,而迴圈直到超時,即使 loginButton 已在畫面中出現,它還是會回傳錯誤而不是真實的,因為我們沒有做重新抓取 loginButton 的動作。

那你可能會想到用以下修改來重新抓取按鈕,每次呼叫 waitForElementAppeared() 都重新傳入元件的程式碼字串,傳入後程式再將 scriptOfGetTheElement 字串轉成程式碼,程式虛擬碼如下所示:

function waitForElementAppeared(scriptOfGetTheElement, timeout) {
   while (!scriptOfGetTheElement.isVisible()) {
      UIALogger.logMessage("等待元件載入完成");

      等候 1 秒;

      if ( 等待時間已逾時 ) {
         UIALogger.logMessage("元件載入等待時間逾時");
         return false;
      }
   }
   return true;
}
這樣的做法程式碼就非常複雜,我找到一個比較簡單的做法,就是透過第三方元件 Tuneup JS Library (http://www.tuneupjs.org/) 中的 waitUntilFoundByName() 來做檢查,它定義在 uiautomation – ext.js 中,函式宣告如下:
waitUntilFoundByName: function (name, timeoutInSeconds) {
   this.waitUntil(function(element) {
      return element.elements().firstWithName(name);
   }, function(element) {
      return element.isValid();
   }, timeoutInSeconds, "to become valid");
}

第一個參數名傳入欲等待出現的元件名稱,第二個參數 timeoutInSeconds 傳入欲等待出現該元件的逾時時間(單位:秒),如果沒設定該函式預設為5秒鐘。

我們只要簡單地呼叫以下的程式碼就可以做到我們要的結果

window.waitUntilFoundByName("login", 10);

使用者呼叫這個函示還有一點要特別注意的就是,當逾時等待時間結束,而等待的元件還沒出現,這時 waitUntilFoundByName() 會拋出一個例外(exception),這時我們必須要使用的 try-catch 補抓例外,如果沒捕抓例外等待逾期時間到,拋出例外程式就會發生錯誤,而讓整個程式停住不會在往下一個步驟執行,最後修改的程式碼如下所示:

try {
   window.waitUntilFoundByName("login");
}
catch(e) {
   UIALogger.logMessage(e);
}
廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s