Indagamos por distintos espacios y así regalarte la respuesta a tu inquietud, en caso de preguntas puedes dejarnos tu comentario y te contestamos sin falta, porque estamos para ayudarte.
Solución:
He estado buscando alternativas y me he conformado con las siguientes versiones. Todos utilizan una espera explícita con un tiempo de espera definido y se basan en las propiedades del elemento en el primer caso y en la obsolescencia del elemento en el segundo caso.
Primera opción estaría verificando las propiedades del elemento hasta que se alcance un tiempo de espera. He llegado a las siguientes propiedades que confirman que está disponible en la página:
Existencia – Una expectativa para comprobar que un elemento está presente en el DOM de una página. Esto no significa necesariamente que el elemento sea visible.
//this will not wait for page to load
Assert.True(Driver.FindElement(By elementLocator).Enabled)
//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementExists(By elementLocator, int timeout = 10)
try
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
return wait.Until(ExpectedConditions.ElementExists(elementLocator));
catch (NoSuchElementException)
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
throw;
Visibilidad – Una expectativa para comprobar que un elemento está presente en el DOM de una página y visible. Visibilidad significa que el elemento no solo se muestra, sino que también tiene una altura y un ancho mayores que 0.
//this will not wait for page to load
Assert.True(Driver.FindElement(By elementLocator).Displayed)
//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementVisible(By elementLocator, int timeout = 10)
try
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
return wait.Until(ExpectedConditions.ElementIsVisible(elementLocator));
catch (NoSuchElementException)
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found.");
throw;
Se puede hacer clic – Una expectativa para verificar un elemento está visible y habilitada para que pueda hacer clic en él.
//this will not wait for page to load
//both properties need to be true in order for element to be clickable
Assert.True(Driver.FindElement(By elementLocator).Enabled)
Assert.True(Driver.FindElement(By elementLocator).Displayed)
//this will search for the element until a timeout is reached
public static IWebElement WaitUntilElementClickable(By elementLocator, int timeout = 10)
try
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
return wait.Until(ExpectedConditions.ElementToBeClickable(elementLocator));
catch (NoSuchElementException)
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
throw;
Segunda elección se aplica cuando el objeto desencadenante, por ejemplo, un elemento de menú, ya no está adjunto al DOM después de hacer clic en él. Este suele ser el caso cuando la acción de hacer clic en el elemento activará una redirección a otra página. En este caso es útil comprobar StalenessOf (elemento) donde elemento es el elemento en el que se hizo clic para activar la redirección a la nueva página.
public static void ClickAndWaitForPageToLoad(By elementLocator, int timeout = 10)
try
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeout));
var element = Driver.FindElement(elementLocator);
element.Click();
wait.Until(ExpectedConditions.StalenessOf(element));
catch (NoSuchElementException)
Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page.");
throw;
driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(5);
Además, vea esta respuesta
Usualmente uso una espera explícita para esto, y espero hasta que los elementos estén visibles, luego paso a la siguiente acción. Esto debería verse así:
WebDriverWait waitForElement = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
waitForElement.Until(ExpectedConditions.ElementIsVisible(By.Id("yourIDHere")));
Más sobre esperas explícitas aquí: Esperas explícitas Selenium C# y aquí WebDriver Esperas explícitas
Aquí tienes las comentarios y valoraciones
Si piensas que ha sido de ayuda este post, sería de mucha ayuda si lo compartieras con el resto desarrolladores y nos ayudes a difundir esta información.