O uso da solução fornecida por Mike Kwan pode afetar o desempenho geral dos testes, pois a espera implícita será usada em todas as chamadas FindElement.
Muitas vezes, você deseja que o FindElement falhe imediatamente quando um elemento não está presente (você está testando uma página malformada, elementos ausentes etc.). Com a espera implícita, essas operações esperariam o tempo limite expirar antes de lançar a exceção. A espera implícita padrão é definida como 0 segundos.
Eu escrevi um pequeno método de extensão no IWebDriver que adiciona um parâmetro de tempo limite (em segundos) ao FindElement()
método. É bastante auto-explicativo:
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);
}
}
Não armazenei em cache o objeto WebDriverWait, pois sua criação é muito barata, essa extensão pode ser usada simultaneamente para diferentes objetos do WebDriver e só otimizo quando necessário.
O uso é direto:
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)
. Isso torna mais claro o IMO #