Використання рішення, наданого Майком Кван, може вплинути на загальну ефективність тестування, оскільки неявне очікування буде використано у всіх викликах FindElement.
Багато разів ви хочете, щоб FindElement вийшов з ладу відразу, коли елемент відсутній (ви тестуєте на неправильну сторінку, відсутні елементи тощо). При неявному очікуванні ці операції зачекають, коли закінчиться весь час очікування, перш ніж викинути виняток. Неявне очікування за замовчуванням встановлено на 0 секунд.
Я написав невеликий метод розширення в IWebDriver, який додає до нього параметр тайм-ауту (у секундах) FindElement()
. Це цілком зрозуміло:
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);
}
}
Я не кешував об’єкт WebDriverWait, оскільки його створення дуже дешеве, це розширення може використовуватися одночасно для різних об’єктів WebDriver, і я роблю оптимізацію лише тоді, коли потрібно.
Використання прямо:
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)
. Це робить більш зрозумілим IMO