Die Verwendung der von Mike Kwan bereitgestellten Lösung kann sich auf die Gesamttestleistung auswirken, da das implizite Warten in allen FindElement-Aufrufen verwendet wird.
Oft möchten Sie, dass das FindElement sofort fehlschlägt, wenn ein Element nicht vorhanden ist (Sie testen auf eine fehlerhafte Seite, fehlende Elemente usw.). Mit dem impliziten Warten würden diese Operationen warten, bis das gesamte Zeitlimit abgelaufen ist, bevor die Ausnahme ausgelöst wird. Die implizite Standardwartezeit ist auf 0 Sekunden festgelegt.
Ich habe eine kleine Erweiterungsmethode für IWebDriver geschrieben, die der FindElement()
Methode einen Timeout-Parameter (in Sekunden) hinzufügt . Es ist ziemlich selbsterklärend:
public static class WebDriverExtensions
{
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
}
Ich habe das WebDriverWait-Objekt nicht zwischengespeichert, da seine Erstellung sehr billig ist. Diese Erweiterung kann gleichzeitig für verschiedene WebDriver-Objekte verwendet werden, und ich mache Optimierungen nur, wenn sie letztendlich benötigt werden.
Die Verwendung ist unkompliziert:
var driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://localhost/mypage");
var btn = driver.FindElement(By.CssSelector("#login_button"));
btn.Click();
var employeeLabel = driver.FindElement(By.CssSelector("#VCC_VSL"), 10);
Assert.AreEqual("Employee", employeeLabel.Text);
driver.Close();
TimeSpan.FromSeconds(5)
. Es macht es klarer IMO