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
}

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

相關文章