El uso de la solución proporcionada por Mike Kwan puede tener un impacto en el rendimiento general de las pruebas, ya que la espera implícita se utilizará en todas las llamadas FindElement.
Muchas veces querrá que FindElement falle inmediatamente cuando un elemento no esté presente (está probando una página con formato incorrecto, elementos faltantes, etc.). Con la espera implícita, estas operaciones esperarían a que expire todo el tiempo de espera antes de lanzar la excepción. La espera implícita predeterminada se establece en 0 segundos.
He escrito un pequeño método de extensión en IWebDriver que agrega un parámetro de tiempo de espera (en segundos) al FindElement()
método. Es bastante claro:
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);
}
}
No almacené en caché el objeto WebDriverWait ya que su creación es muy barata, esta extensión se puede usar simultáneamente para diferentes objetos WebDriver, y solo hago optimizaciones cuando finalmente se necesita.
El uso es sencillo:
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)
. Lo deja más claro IMO