chrome - Selenium: cómo hacer que el controlador web espere a que la página se actualice antes de ejecutar otra prueba
selenium webdriver python (3)
Si está esperando que se presente un elemento, entonces
En selenio rc solíamos hacer esto usando selenio.WaitForCondition ("selenium.isElementPresent (/" fContent / ")", "desiredTimeoutInMilisec")
En el controlador web U puede lograr lo mismo usando esto
WebDriverWait myWait = new WebDriverWait(webDriver, 45);
ExpectedCondition<Boolean> conditionToCheck = new ExpectedCondition<Boolean>()
{
@Override
public Boolean apply(WebDriver input) {
return (input.findElements(By.id("fContent")).size() > 0);
}
};
myWait.until(conditionToCheck);
De esta forma puede esperar que su elemento esté presente antes de ejecutar su prueba2.
ACTUALIZADO :
Si está esperando cargar la página, en el controlador web puede usar este código:
public void waitForPageLoaded(WebDriver driver)
{
ExpectedCondition<Boolean> expectation = new
ExpectedCondition<Boolean>()
{
public Boolean apply(WebDriver driver)
{
return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
}
};
Wait<WebDriver> wait = new WebDriverWait(driver,30);
try
{
wait.until(expectation);
}
catch(Throwable error)
{
assertFalse("Timeout waiting for Page Load Request to complete.",true);
}
}
Estoy escribiendo casos de prueba usando Selenium web Driver en TestNG y tengo un escenario en el que estoy ejecutando varias pruebas de forma secuencial (consulte a continuación)
@Test(priority =1)
public void Test1(){
}
@Test(priority =2)
public void Test2(){
}
Ambas pruebas son llamadas AJAX donde se abre un cuadro de diálogo, las pruebas se ejecutan, luego se cierra el cuadro de diálogo y luego aparece un mensaje de notificación en la parte superior de la página y después de cada prueba exitosa, la página se actualiza .
El problema es: Test2 no espere a que la página se actualice / vuelva a cargar. Supongamos que cuando Test1 se completa con éxito, Test2 se iniciará antes de la actualización de la página (es decir, abre el cuadro de diálogo, ejecuta escenarios, etc.) mientras la página se actualiza (lo que sucedería después de la ejecución exitosa de Test1). Ahora que la página se actualiza, el cuadro de diálogo abierto debido a Test2 ya no está presente y luego Test2 falla.
(Además, no sé cuánto tiempo llevará actualizar la página. Por lo tanto, no quiero utilizar Thread.sleep (xxxx) antes de ejecutar Test2 )
Además, no creo
driver.navigate().refresh()
resolverá mi problema poniéndolo antes de Test2 ya que en ese caso mi página se actualizará dos veces. El problema es la actualización que está ocurriendo a través del código (que es incierto ya que puede llevar 1 seg o 3 segundos o 5 segundos)
si pudieras activar un cambio de URL esto funcionaría
WebDriverWait wait = new WebDriverWait(yourDriver, TimeSpan.FromSeconds(5));
wait.Until(ExpectedConditions.UrlContains("/url-fragment"));
Here hay una versión mejor y probada de la implementación de WaitForPageLoad
en C # .Net
public void WaitForPageLoad(int maxWaitTimeInSeconds) {
string state = string.Empty;
try {
WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(maxWaitTimeInSeconds));
//Checks every 500 ms whether predicate returns true if returns exit otherwise keep trying till it returns ture
wait.Until(d = > {
try {
state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString();
} catch (InvalidOperationException) {
//Ignore
} catch (NoSuchWindowException) {
//when popup is closed, switch to last windows
_driver.SwitchTo().Window(_driver.WindowHandles.Last());
}
//In IE7 there are chances we may get state as loaded instead of complete
return (state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase));
});
} catch (TimeoutException) {
//sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls
if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase))
throw;
} catch (NullReferenceException) {
//sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls
if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase))
throw;
} catch (WebDriverException) {
if (_driver.WindowHandles.Count == 1) {
_driver.SwitchTo().Window(_driver.WindowHandles[0]);
}
state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString();
if (!(state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase)))
throw;
}
}