WinAppDriver 等待時間設定技巧

Chao Wang發表於2020-09-04

做桌面程式的自動化測試,難免會涉及到控制元件的等待,比如當點選一個 Button 時,要等待一個 Window 的出現,然後在該 Window 上操作其他控制元件。最簡單粗暴的方式是使用Thread.Sleep()方法,直接阻塞執行緒,當然這也是最不推薦的方式,因為太不優雅的可擴充套件性太差,等待時間是寫死的😒

那麼如何解決呢🙂

WinAppDriver 提供一種根據條件判斷是否中止的方法 Until(), 它會在指定時間內 (Timeout) 執行操作,如果沒有返回標誌,就會一直執行,一旦發現返回標誌,就會退出執行,其中返回的標誌有三種

  • 返回 true
  • 執行時間超過設定的超時時間
  • 在執行期間丟擲的異常不在期望的異常列表裡
public static void WaitAction(this WindowsDriver<WindowsElement> driver, Action action, int secondTimeOut = 60)
{
  // 設定超時時間
  var waiter = new DefaultWait<WindowsDriver<WindowsElement>>(driver)
  {
       Timeout = TimeSpan.FromSeconds(secondTimeOut),
  };
  // 設定忽略異常,一般當尋找控制元件而有沒有找到時會丟擲該異常,設定後在等待中一旦發生該異常,還是會繼續尋找控制元件
  waiter.IgnoreExceptionTypes(typeof(InvalidOperationException));

  // 等待有三種結束標誌,
  // 1. 當返回值為true
  // 2. 當發生異常不在異常列表裡
  // 3. 超過設定時間
  waiter.Until((s) =>
  {
      // 執行我們想要執行的操作, 一旦發生錯誤,便不會到第二步 return true,而前面我們已經設定好忽略的異常, 所以
      // 這裡會在Timeout時間內一直執行我們的操作,直到達到要求為止
      action?.Invoke();
      return true;
  });
}

上面程式碼是我封裝好一個方法,目的是動態獲取控制元件,不必每次去 Thread.Sleep()相應的時間

WindowsElement addDataButton = null;
_earthDriver.WaitAction(() => 
{
    addDataButton = _earthDriver.FindElementByAccessibilityId("MainAddDataButton");                   
},300);

if (addDataButton == null)
{
  // Do something
}
else
{
  // Do other things
}

然後我們在應用的時候,就可以向上面的指令碼一樣去實踐,這樣就極大的增加了測試指令碼的穩定性😎

相關文章