java - chrome - selenium webdriver ruby
Selenio-Cómo esperar hasta que la página esté completamente cargada (5)
Esta pregunta ya tiene una respuesta aquí:
- Espera carga de página en Selenium 45 respuestas
Estoy tratando de automatizar algunos casos de prueba utilizando Java y el controlador web Selenium. Tengo el siguiente escenario:
- Hay una página llamada ''Productos''. Cuando hago clic en el enlace ''Ver detalles'' en la página ''Producto'', aparece una ventana emergente (diálogo modal) que contiene los detalles del elemento.
- Cuando hago clic en el botón ''Cerrar'' en la ventana emergente, la ventana emergente se cierra y la página se actualiza automáticamente (la página solo se está recargando, el contenido permanece sin cambios).
Después de cerrar la ventana emergente, necesito hacer clic en el botón "Agregar elemento" en la misma página. Pero cuando el controlador web intenta encontrar el botón "Agregar elemento", si la velocidad de Internet es demasiado rápida, el controlador web puede encontrar y hacer clic en el elemento.
Pero si Internet es lento, webdriver encuentra el botón antes de la actualización de la página, pero tan pronto como el controlador web hace clic en el botón, la página se actualiza y aparece la excepción StaleElementReferenceException.
- Incluso si se usan esperas diferentes, todas las condiciones de espera se cumplen (ya que los contenidos de la página son los mismos antes y después de la recarga) incluso antes de que la página se vuelva a cargar y se produzca la excepción StaleElementReferenceException.
El caso de prueba funciona bien si Thread.sleep(3000);
se utiliza antes de hacer clic en el botón ''Agregar elemento''. ¿Hay alguna otra solución para este problema?
3 respuestas, que puedes combinar:
1.) Establezca la espera implícita inmediatamente después de crear la instancia del controlador web: driver.manage().timeouts().implicitlyWait()
. Esto intentará esperar hasta que la página esté completamente cargada en cada navegación o recarga de la página.
2.) Después de navegar por la página, llame a JavaScript return document.readyState
hasta que se return document.readyState
"complete"
. La instancia del controlador web puede servir como ejecutor de JavaScript. Código de muestra:
DO#
new WebDriverWait(driver, MyDefaultTimeout).Until(
d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));
Java
new WebDriverWait(firefoxDriver, pageLoadTimeout).until(
webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
3.) Después de 2.), verifique si la URL coincide con el patrón que espera.
Hay dos formas diferentes de usar la demora en selenio, una de las más utilizadas. Por favor intente esto:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
la segunda, que puede usar, es simplemente intentar el método de captura utilizando ese método, puede obtener el resultado deseado. Si desea un código de ejemplo, no dude en ponerse en contacto conmigo de manera desafiante. Proporcionaré el código relacionado.
Parece que debe esperar a que la página se vuelva a cargar antes de hacer clic en el botón "Agregar". En este caso, podría esperar a que el elemento "Agregar elemento" se vuelva obsoleto antes de hacer clic en el elemento recargado:
WebDriverWait wait = new WebDriverWait(driver, 20);
By addItem = By.xpath("//input[.=''Add Item'']");
// get the "Add Item" element
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(addItem));
//trigger the reaload of the page
driver.findElement(By.id("...")).click();
// wait the element "Add Item" to become stale
wait.until(ExpectedConditions.stalenessOf(element));
// click on "Add Item" once the page is reloaded
wait.until(ExpectedConditions.presenceOfElementLocated(addItem)).click();
Puede hacer esto de muchas maneras antes de hacer clic en agregar elementos:
WebDriverWait wait = new WebDriverWait(driver, 40);
wait.until(ExpectedConditions.elementToBeClickable(By.id("urelementid")));// instead of id u can use cssSelector or xpath of ur element.
or
wait.until(ExpectedConditions.visibilityOfElementLocated("urelement"));
También puedes esperar así. Si desea esperar hasta que sea invisible el elemento de la página anterior:
wait.until(ExpectedConditions.invisibilityOfElementLocated("urelement"));
Aquí está el enlace donde puede encontrar toda la API de Selenium Webdriver que puede usarse para esperar y su documentación.
sí se produce un error de elemento obsoleto cuando (tomando su escenario) ha definido la estrategia del localizador para hacer clic en "Agregar elemento" primero y luego, al cerrar la ventana emergente, la página se actualiza, por lo que la referencia definida para "Agregar artículo" memoria para superar esto, tienes que redefinir la estrategia del localizador para ''Agregar artículo'' de nuevo
Entiéndelo con un código ficticio.
// clicking on view details
driver.findElement(By.id("")).click();
// closing the pop up
driver.findElement(By.id("")).click();
// and when you try to click on Add Item
driver.findElement(By.id("")).click();
// you get stale element exception as reference to add item is lost
// so to overcome this you have to re identify the locator strategy for add item
// Please note : this is one of the way to overcome stale element exception
// Step 1 please add a universal wait in your script like below
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); // just after you have initiated browser