Estoy trabajando en un Java Selenium-WebDriver. yo añadí
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
y
WebElement textbox = driver.findElement(By.id("textbox"));
porque mis aplicaciones tardan unos segundos en cargar la interfaz de usuario. Así que configuré 2 segundos implícitamente. pero no pude ubicar el cuadro de texto del elemento
Luego agrego Thread.sleep(2000);
Ahora funciona bien. ¿Cuál es mejor forma?
java
selenium
selenium-webdriver
webdriver
Príncipe
fuente
fuente
Respuestas:
Bueno, hay dos tipos de espera: espera explícita e implícita. La idea de la espera explícita es
El concepto de espera implícita es
Puede ver la diferencia en los detalles aquí .
En tales situaciones, preferiría usar una espera explícita (
fluentWait
en particular):fluentWait
La función devuelve su elemento web encontrado. De la documentación en adelantefluentWait
: Una implementación de la interfaz de espera que puede tener su tiempo de espera y el intervalo de sondeo configurados sobre la marcha. Cada instancia de FluentWait define la cantidad máxima de tiempo de espera para una condición, así como la frecuencia con la que se verifica. Además, el usuario puede configurar la espera para ignorar tipos específicos de excepciones mientras espera, como NoSuchElementExceptions al buscar un elemento en la página. Detalles que puede obtener aquíEl uso de
fluentWait
en su caso será el siguiente:En mi humilde opinión, este enfoque es mejor, ya que no sabe exactamente cuánto tiempo esperar y en el intervalo de sondeo puede establecer un valor de tiempo arbitrario mediante el cual se verificará la presencia del elemento. Saludos.
fuente
import com.google.common.base.Function;
, noimport java.util.function.Function;
Function
se estaba utilizando. No fue obvio para mí al principio. Gracias por la respuesta.driver -> driver.findElement(locator)
. Al usar esto, no necesitará una declaración de importación en absoluto..withTimeout(Duration.ofSeconds(30)).pollingEvery(Duration.ofSeconds(5))
en lugar de:.withTimeout(30, TimeUnit.SECONDS).pollingEvery(5, TimeUnit.SECONDS)
Este hilo es un poco más antiguo, pero pensé en publicar lo que hago actualmente (trabajo en progreso).
Aunque todavía estoy en situaciones en las que el sistema está bajo una gran carga y cuando hago clic en un botón de envío (por ejemplo, login.jsp), las tres condiciones (ver más abajo) regresan,
true
pero la página siguiente (por ejemplo, home.jsp) no aparece. t comenzó a cargar todavía.Este es un método de espera genérico que toma una lista de condiciones esperadas.
He definido varias condiciones esperadas reutilizables (tres están a continuación). En este ejemplo, las tres condiciones esperadas incluyen document.readyState = 'complete', sin "wait_dialog" presente y sin 'spinners' (elementos que indican que se están solicitando datos asíncronos).
Solo el primero se puede aplicar genéricamente a todas las páginas web.
Dependiendo de la página, puedo usar uno o todos:
También hay condiciones esperadas predefinidas en la siguiente clase: org.openqa.selenium.support.ui.ExpectedConditions
fuente
Si usa webdriverJs (node.js),
El código anterior hace que el navegador espere 5 segundos después de hacer clic en el botón.
fuente
Usar
Thread.sleep(2000);
es una espera incondicional. Si su prueba se carga más rápido, aún tendrá que esperar. Entonces, en principio, usarimplicitlyWait
es la mejor solución.Sin embargo, no veo por qué
implicitlyWait
no funciona en su caso. ¿Midió si enfindElement
realidad tarda dos segundos antes de lanzar una excepción? Si es así, ¿puede intentar usar la espera condicional de WebDriver como se describe en esta respuesta?fuente
Me gusta usar condiciones personalizadas. Aquí hay algo de código en Python:
Siempre que necesite esperar, puede hacerlo explícitamente verificando la existencia de un determinado elemento (dicho elemento puede variar de una página a otra).
find_elements_by_id
lista de devoluciones: vacía o no, solo tiene que verificar.fuente
el clic parece estar bloqueando? - aquí hay otra forma de esperar si está usando WebDriverJS:
El código anterior espera después de hacer clic en el botón para que se cargue la página siguiente y luego toma la fuente de la página siguiente.
fuente
Implícitamente wait y Thread.sleep Ambos se usan solo para sincronización ... pero la diferencia es que podemos usar Implícitamente esperar para todo el programa, pero Thread.sleep funcionará solo para ese código único ... Aquí mi sugerencia es usar Implícitamente esperar una vez en el programa cuando cada vez que su página web se actualice significa que use Thread.sleep en ese momento ... será mucho mejor :)
Aquí está mi código:
fuente
A veces, la espera implícita parece anularse y el tiempo de espera se acorta. [@ eugene.polschikov] tenía buena documentación sobre los porqués. En mis pruebas y codificación con Selenium 2, descubrí que las esperas implícitas son buenas, pero ocasionalmente tienes que esperar explícitamente.
Es mejor evitar llamar directamente a un hilo para dormir, pero a veces no hay una buena forma de evitarlo. Sin embargo, hay otras opciones de espera proporcionadas por Selenium que ayudan. waitForPageToLoad y waitForFrameToLoad han demostrado ser especialmente útiles.
fuente
Espera implícita: durante la espera implícita si el controlador web no puede encontrarlo inmediatamente debido a su disponibilidad, el controlador web esperará el tiempo mencionado y no intentará encontrar el elemento nuevamente durante el período de tiempo especificado. Una vez que finaliza el tiempo especificado, intentará buscar el elemento una vez más la última vez antes de lanzar la excepción. La configuración predeterminada es cero. Una vez que establecemos una hora, el controlador web espera el período de la instancia del objeto WebDriver.
Espera explícita: puede haber una instancia en la que un elemento en particular tarda más de un minuto en cargarse. En ese caso, definitivamente no le gusta establecer un tiempo enorme para la espera implícita, ya que si lo hace, su navegador esperará el mismo tiempo para cada elemento. Para evitar esa situación, simplemente puede dedicar un tiempo separado solo al elemento requerido. Al seguir esto, el tiempo de espera implícito de su navegador sería corto para cada elemento y sería grande para un elemento específico.
fuente
A veces, la espera implícita falla, diciendo que un elemento existe pero en realidad no es así.
La solución es evitar el uso de driver.findElement y reemplazarlo con un método personalizado que usa una espera explícita implícitamente. Por ejemplo:
Hay razones adicionales para evitar la espera implícita que no sean fallas esporádicas y ocasionales (consulte este enlace ).
Puede utilizar este método de "elemento" de la misma forma que driver.findElement. Por ejemplo:
Si realmente desea esperar unos segundos para la resolución de problemas o alguna otra ocasión poco común, puede crear un método de pausa similar al que ofrece el IDE de selenio:
fuente
Respuesta : espere unos segundos antes de que la visibilidad del elemento con Selenium WebDriver siga los métodos a continuación.
implicitlyWait () : la instancia de WebDriver espera hasta que se cargue la página completa. Puede utilizar de 30 a 60 segundos para esperar la carga de la página completa.
ExplicitlyWait WebDriverWait () : la instancia de WebDriver espera hasta que se cargue la página completa.
Nota : utilice ExplicitlyWait WebDriverWait () para manejar cualquier WebElement en particular.
fuente
Usar acciones -
Consulte Acciones # método de pausa .
fuente
Prefiero que el siguiente código espere 2 segundos.
fuente
es lo peor: siendo una espera estática, hará que el script de prueba sea más lento.
esta es una espera dinámica
Finalmente, lo que sugiero es
con algunas condiciones predefinidas:
fuente
Esto me ayudó, pero la excepción InterruptedException debe solucionarse. Así que mejor rodearlo con try and catch:
O
Agregar declaración de lanzamientos:
Preferiría el segundo ya que luego se puede usar
sleep()
tantas veces como se quiera y evitar la repeticióntry
y elcatch
bloqueo cada vez quesleep()
se haya usado.fuente