¿Alguien puede decirme cómo puedo hacer que el selenio espere hasta que la página se cargue por completo? Quiero algo genérico, sé que puedo configurar WebDriverWait y llamar a algo como 'buscar' para que espere, pero no voy tan lejos. Solo necesito probar que la página se carga correctamente y pasar a la página siguiente para probar.
Encontré algo en .net pero no pude hacerlo funcionar en Java ...
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
¿Alguna idea de alguien?
Respuestas:
Prueba este código:
El código anterior esperará hasta 10 segundos para cargar la página. Si la carga de la página excede el tiempo, arrojará el
TimeoutException
. Capturas la excepción y haces tus necesidades. No estoy seguro de si se cierra la carga de la página después de la excepción lanzada. No probé este código todavía. Solo quiero probarlo.Esta es una espera implícita. Si configura esto una vez, tendrá el alcance hasta que la instancia del controlador web se destruya.
Vea la documentación para
WebDriver.Timeouts
para más información.fuente
Su solución sugerida solo espera DOM
readyState
señalecomplete
. Pero Selenium por defecto intenta esperar a esos (y un poco más) en las cargas de página a través dedriver.get()
yelement.click()
métodos . Ya están bloqueando, esperan a que la página se cargue por completo y deberían funcionar correctamente.El problema, obviamente, son los redireccionamientos a través de solicitudes AJAX y scripts en ejecución: Selenium no puede atraparlos, no espera a que terminen. Además, no puede atraparlos de manera confiable
readyState
: espera un poco, lo que puede ser útil, pero indicarácomplete
mucho antes de que se descargue todo el contenido de AJAX.No existe una solución general que funcione en todas partes y para todos, por eso es difícil y todos usan algo un poco diferente.
La regla general es confiar en WebDriver para que haga su parte, luego usar esperas implícitas, luego usar esperas explícitas para los elementos que desea afirmar en la página, pero hay muchas más técnicas que se pueden hacer. Debe elegir el (o una combinación de varios de ellos) que mejor funcione en su caso, en su página probada.
Vea mis dos respuestas con respecto a esto para obtener más información:
fuente
element.click()
llamadas.Esta es una versión Java funcional del ejemplo que dio:
Ejemplo para c #:
fuente
import com.google.common.base.Predicate
Aquí está mi intento de una solución completamente genérica, en Python:
Primero, una función genérica de "espera" (use un WebDriverWait si lo desea, los encuentro feos):
Luego, la solución se basa en el hecho de que el selenio registra un número de identificación (interno) para todos los elementos de una página, incluido el
<html>
elemento de nivel superior . Cuando una página se actualiza o carga, obtiene un nuevo elemento html con una nueva ID.Entonces, suponiendo que desea hacer clic en un enlace con el texto "mi enlace", por ejemplo:
Para obtener más ayuda Pythonic, reutilizable, genérica, puede hacer un administrador de contexto:
Y luego puede usarlo en casi cualquier interacción de selenio:
Creo que es a prueba de balas! ¿Qué piensas?
Más información en una publicación de blog al respecto aquí
fuente
Tuve un problema similar. Necesitaba esperar hasta que mi documento estuviera listo, pero también hasta que todas las llamadas de Ajax hubieran terminado. La segunda condición resultó ser difícil de detectar. Al final verifiqué las llamadas activas de Ajax y funcionó.
Javascript:
Método completo de C #:
fuente
document.readyState == 'complete' && jQuery.active == 0
para reaccionar?fuente
Para C # NUnit, debe convertir WebDriver a JSExecuter y luego ejecutar el script para verificar si el estado document.ready está completo o no. Verifique el siguiente código para referencia:
Esto esperará hasta que se cumpla la condición o se agote el tiempo de espera.
fuente
Para la carga inicial de la página, he notado que "Maximizar" la ventana del navegador prácticamente espera hasta que se complete la carga de la página (incluidas las fuentes)
Reemplazar:
Con:
de uso:
Esto cargará la página, esperará hasta que se complete, maximice y enfóquese en ella. No sé por qué es así, pero funciona.
Si desea esperar la carga de la página después de hacer clic en el siguiente o cualquier otro activador de navegación de página que no sea "Navegar ()", la respuesta de Ben Dyer (en este hilo) hará el trabajo.
fuente
Echa un vistazo al marco web de tapices . Puede descargar el código fuente allí.
La idea es señalar que la página está lista por el atributo html del cuerpo. Puede usar esta idea para ignorar casos complicados de demandas.
Y luego cree la extensión de Selenium webdriver (de acuerdo con el marco de tapices)
Use la extensión ElementIsDisplayed escrita por Alister Scott .
Y finalmente crear prueba:
fuente
La respuesta de Ben Dryer no se compiló en mi máquina (
"The method until(Predicate<WebDriver>) is ambiguous for the type WebDriverWait"
).Versión de Java 8 de trabajo:
Versión de Java 7:
fuente
Intenté este código y me funciona. Llamo a esta función cada vez que me muevo a otra página
fuente
En Nodejs puedes conseguirlo a través de promesas ...
Si escribe este código, puede estar seguro de que la página está completamente cargada cuando llegue al ...
Si escribe este código, navegará y el selenio esperará 3 segundos ...
De la documentación de Selenium:
this.get (url) → Thenable
Programa un comando para navegar a la URL dada.
Devuelve una promesa que se resolverá cuando el documento haya terminado de cargarse .
Documentación de selenio (Nodejs)
fuente
La espera para el evento document.ready no es la solución completa a este problema, porque este código aún se encuentra en una condición de carrera: a veces, este código se activa antes de que se procese el evento click, por lo que este regresa directamente, ya que el navegador no ha comenzado cargando la nueva página todavía.
Después de algunas búsquedas, encontré una publicación en Obay, la cabra de prueba , que tiene una solución para este problema. El código C # para esa solución es algo como esto:
`Disparo este método directamente después de driver.navigate.gotourl, para que obtenga una referencia de la página lo antes posible. ¡Diviértete con eso!
fuente
normalmente cuando el selenio abre una nueva página con un clic o envía u obtiene métodos, esperará hasta que se cargue la página, pero el problema es cuando la página tiene una llamada xhr (ajax), nunca esperará a que se cargue la xhr, por lo que crear un nuevo método para monitorear un xhr y esperarlos será lo bueno.
if $.active == 0
así que no hay una llamada xhrs activa (que solo funciona con jQuery). para la llamada javascript ajax, debe crear una variable en su proyecto y simularla.fuente
Puedes escribir algo de lógica para manejar esto. Escribí un método que devolverá
WebElement
y este método se llamará tres veces o puede aumentar el tiempo y agregar un cheque nulo paraWebElement
Aquí hay un ejemplofuente
Ejecuté un código javascript para verificar si el documento está listo. Me ahorró mucho tiempo depurando pruebas de selenio para sitios que tienen representación del lado del cliente.
}
fuente
fuente
Al igual que Rubanov escribió para C #, lo escribo para Java, y es:
fuente
En Java le gustará a continuación: -
fuente
return document.readyState == 'loaded' || return document.readyState == 'complete'
El siguiente código probablemente debería funcionar:
fuente
Si tiene una página lenta o una conexión de red, es probable que ninguno de los anteriores funcione. Los he probado todos y lo único que funcionó para mí es esperar el último elemento visible en esa página. Tomemos, por ejemplo, la página web de Bing. Han colocado un icono de CÁMARA (buscar por botón de imagen) al lado del botón de búsqueda principal que solo es visible después de que se haya cargado la página completa. Si todos hicieron eso, entonces todo lo que tenemos que hacer es usar una espera explícita como en los ejemplos anteriores.
fuente
fuente
Aquí hay algo similar, en Ruby:
fuente
Puede hacer que el hilo se suspenda hasta que se vuelva a cargar la página. Esta no es la mejor solución, porque necesita tener una estimación de cuánto tiempo tarda la página en cargar.
fuente
Comprobé la carga de la página completa, trabajo en Selenium 3.14.0
fuente
Para las personas que necesitan esperar a que aparezca un elemento específico. (usado c #)
Entonces, si desea esperar, por ejemplo, si existe una clase = "mensaje de error" en el DOM, simplemente haga lo siguiente:
Para id, entonces será
WaitForElement(driver, By.Id("yourid"));
fuente
¿Estás usando Angular? Si es así, es posible que el controlador web no reconozca que las llamadas asíncronas han terminado.
Recomiendo mirar Paul Hammants ngWebDriver . El método waitForAngularRequestsToFinish () podría ser útil.
fuente