example chrome java selenium-webdriver

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í:

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.

https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html


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