¿Cómo hace que Selenium 2.0 espere a que se cargue la página?
java
selenium
webdriver
selenium-webdriver
karthick kumar
fuente
fuente
Respuestas:
También puede verificar la página cargada usando el siguiente código
fuente
Utilice la clase WebDriverWait
Ver también aquí
Puede esperar mostrar algún elemento. algo así como en C #:
fuente
Si configura la espera implícita del controlador, luego llama al
findElement
método en un elemento que espera que esté en la página cargada, el WebDriver sondeará ese elemento hasta que encuentre el elemento o alcance el valor de tiempo de espera.fuente: implícito-espera
fuente
En general, con Selenium 2.0, el controlador web solo debe devolver el control al código de llamada una vez que ha determinado que la página se ha cargado. Si no es así, puede llamar
waitforelemement
, lo que alterna las llamadasfindelement
hasta que se encuentre o se agote el tiempo de espera (se puede configurar el tiempo de espera).fuente
If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
JavascriptExecutor
, esperando que document.readyState esté "completo". Debido al viaje de ida y vuelta del selenio al navegador, supongo que la condición de carrera se mitiga, y esto "siempre" funciona para mí. Después de "hacer clic ()" cuando espero que se cargue una página, espero explícitamente (usando WebDriverWait) el estado listo. ]Implementación de Ruby:
fuente
Puedes quitar la
System.out
línea. Se agrega con fines de depuración.fuente
Todas estas soluciones están bien para casos específicos, pero sufren al menos uno de los dos posibles problemas:
No son lo suficientemente genéricos: quieren que sepas, de antemano, que se cumplirá alguna condición específica de la página a la que irás (por ejemplo, se mostrará algún elemento)
Están abiertos a una condición de carrera en la que utiliza un elemento que está realmente presente en la página anterior y en la nueva.
Aquí está mi intento de una solución genérica que evite este problema (en Python):
Primero, una función genérica de "espera" (use un WebDriverWait si lo desea, los encuentro feos):
A continuación, 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 nivel superior
<html>
elemento de . 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
También puede usar la clase:
ExpectedConditions
para esperar explícitamente a que se muestre un elemento en la página web antes de que pueda realizar cualquier otra acción.Puede usar la
ExpectedConditions
clase para determinar si un elemento es visible:Consulte la
ExpectedConditions class Javadoc
lista de todas las condiciones que puede verificar.fuente
La respuesta de Imran se volvió a contar para Java 7:
fuente
Esto parece ser una limitación seria de WebDriver. Obviamente, esperar un elemento no implicará que la página se cargue, en particular, el DOM se puede construir completamente (estado listo) por el cual JS todavía se está ejecutando y CSS y las imágenes aún se están cargando.
Creo que la solución más simple es establecer una variable JS en el evento de carga después de que todo se inicializa y verificar y esperar esta variable JS en Selenium.
fuente
Si desea esperar a que se cargue un elemento específico, puede usar el
isDisplayed()
método enRenderedWebElement
:(Ejemplo de la guía de inicio de 5 minutos )
fuente
RenderedWebElement
en la API. Sin embargo, elisDisplayed()
método ahora está disponible directamente enWebElement
.Espera explícitamente o espera condicional en esta espera hasta que se dé esta condición.
Esto esperará a cada elemento web durante 60 segundos.
Use implícitamente la espera de espera de cada elemento en la página hasta ese momento
Esto esperará a cada elemento web durante 60 segundos.
fuente
Utilice implícitamente esperar a la espera de cada elemento en la página hasta el momento dado.
esta espera para cada elemento en la página durante 30 segundos.
Otra espera es Esperar explícitamente o esperar condicional en esta espera hasta la condición dada.
En id, proporcione la identificación del elemento estático que se muestra de forma diferente en la página, tan pronto como se carga la página.
fuente
Me sorprende que los predicados no hayan sido la primera opción, ya que normalmente sabes con qué elementos interactuarás en la página que estás esperando para cargar. Mi enfoque siempre ha sido construir predicados / funciones como
waitForElementByID(String id)
ywaitForElemetVisibleByClass(String className)
, etc. y luego usarlos y reutilizarlos donde sea que los necesite, ya sea para cargar una página o cambiar el contenido de la página que estoy esperando.Por ejemplo,
En mi clase de prueba:
En mi clase de prueba padre:
Aunque esto parece mucho, se encarga de verificar repetidamente para usted y el intervalo de la frecuencia con la que se puede verificar junto con el tiempo de espera final antes de que se agote el tiempo. Además, reutilizará dichos métodos.
En este ejemplo, la clase padre definió e inició el
WebDriver driver
y elWebDriverWait driverWait
.Espero que esto ayude.
fuente
La mejor manera de esperar cargas de página cuando se usan los enlaces Java para WebDriver es usar el patrón de diseño de Objeto de página con PageFactory. Esto le permite utilizar el
AjaxElementLocatorFactory
que, simplemente, actúa como una espera global para todos sus elementos. Tiene limitaciones en elementos como buzones o transiciones complejas de javascript, pero reducirá drásticamente la cantidad de código necesario y acelerará los tiempos de prueba. Un buen ejemplo se puede encontrar en este blog. Se supone una comprensión básica de Core Java.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
fuente
Solución NodeJS:
En Nodejs puedes conseguirlo mediante 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
Aquí hay una versión Java 8 de la respuesta más votada actualmente :
Donde
myDriver
es unWebDriver
objeto (declarado anteriormente).Nota : Tenga en cuenta que este método (
document.readyState
) solo verifica el DOM.fuente
Llame a continuación a Function en su script, esto esperará hasta que la página no se cargue usando javascript
fuente
Puede cambiar del documento a un elemento, en el caso de que solo se cambie parte del documento.
Esta técnica se inspiró en la respuesta de sincebasic.
fuente
Selenio Camarero :
Y para usarlo :
fuente
Puede usar el siguiente método existente para establecer el tiempo para pageeLoadTimeout en el ejemplo siguiente si la página tarda más de 20 segundos en cargarse, entonces arrojará una excepción de recarga de página
fuente
Puede esperar explícitamente a que aparezca un elemento en la página web antes de realizar cualquier acción (como element.click ())
Esto es lo que usé para un escenario similar y funciona bien.
fuente
Mi manera simple:
fuente
La mejor manera que he visto es utilizar el
stalenessOf
ExpectedCondition, esperar a que la página anterior se vuelva obsoleta.Ejemplo:
Esperará diez segundos para que la antigua etiqueta HTML se vuelva obsoleta y luego lanzará una excepción si no sucede.
fuente
Uso node + selenium-webdriver (cuya versión es 3.5.0 ahora). lo que hago para esto es:
fuente
Puedes usar esperar. básicamente hay 2 tipos de espera en selenio
- Espera implícita
Esto es muy simple, vea la sintaxis a continuación:
- Espera explícita
Espera explícitamente o espera condicional en esta espera hasta que se produzca la condición dada.
Puede usar otras propiedades como
visblityOf()
,visblityOfElement()
fuente
Si alguien usa seleniuro:
Más condiciones se pueden encontrar aquí: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
fuente
En mi caso, utilicé lo siguiente para conocer el estado de carga de la página. En nuestra aplicación, los gifs de carga están presentes y los escucho de la siguiente manera para eliminar el tiempo de espera no deseado en el script.
Donde el xpath localiza el gif en el DOM HTML. Después de esto, también puede implementar sus métodos de acción Haga clic.
fuente
Hombre, todas estas respuestas requieren demasiado código. Esto debería ser algo simple, ya que es bastante común.
¿Por qué no simplemente inyectar javascript simple con el controlador web y verificar? Este es el método que uso en mi clase de webscraper. El javascript es bastante básico incluso si no conoce js.
fuente
Cómo hacer que Selenium espere la carga de la página después de un clic proporciona el siguiente enfoque interesante:
WebElement
desde la página anterior.WebElement
hasta queStaleElementReferenceException
se lance.Código de muestra:
fuente
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
.