Использование решения, предоставленного Майком Кваном, может повлиять на общую производительность тестирования, поскольку неявное ожидание будет использоваться во всех вызовах 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