Java''s FluentWait en Python
selenium selenium-webdriver (3)
Creo que puede hacer esto con Python, sin embargo, no está empaquetado tan simplemente como una clase FluentWait. Algo de esto se cubrió en la documentación que proporcionó de forma no exhaustiva.
La clase WebDriverWait tiene argumentos opcionales para timeout, poll_frequency e ignored_exceptions. Para que pueda suministrarlo allí. Luego, combínelo con una Condición esperada para esperar a que aparezcan elementos, hacer clic, etc. Aquí hay un ejemplo:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import *
driver = webdriver.Firefox()
# Load some webpage
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))
Obviamente, puede combinar el elemento wait / en una sola declaración, pero pensé de esta manera que puede ver dónde se implementa.
En el paquete java selenium-webdriver, hay una clase
FluentWait
:
Cada instancia de FluentWait define la cantidad máxima de tiempo para esperar una condición, así como la frecuencia con la que verificar la condición. 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.
En otras palabras, es algo más que una espera implícita y explícita , le da más control para esperar un elemento. Puede ser muy útil y definitivamente tiene casos de uso.
¿Hay algo similar en el paquete de selenio de Python , o debería implementarlo yo mismo?
(He revisado la documentación de Waits , nada allí).
La implementación anterior no funcionó bien en mi caso de uso, por lo que también compartiría mi implementación. Para una espera fluida, también es bueno verificar algunos otros criterios al sondear, por ejemplo, podemos verificar si un atributo de un elemento ha cambiado. Entonces, en mi condición, la página debe actualizarse. A continuación se muestra el código [se ajusta durante 30 segundos (6 veces el ciclo y 5 veces por segundo)]:
element = None
i = 6
while element is None:
try:
wait = WebDriverWait(driver, 5, poll_frequency=1)
element = wait.until(expected_conditions.visibility_of_element_located(el))
except:
driver.refresh()
i = i - 1
print(i)
if i < 0:
raise Exception(''Element not found'')
La respuesta de iChar cubre cómo usar
WebDriverWait
en Python para hacer lo que
FluentWait
hace en Java.
Sin embargo, algunos aspectos de la pregunta no se abordaron:
En otras palabras, [
FluentWait
] es algo más que una espera implícita y explícita
No. A partir de la versión 2.42.x de Selenium, solo hay dos tipos de esperas que implementa Selenium: implícito y explícito.
FluentWait
no es algo adicional a estos dos tipos de espera.
Es solo una espera explícita.
¿Hay algo similar en el paquete de selenio de Python, o debería implementarlo yo mismo?
Lo único en lo que puedo pensar es que falta la implementación
WebDriverWait
de Python que
FluentWait
(y
WebDriverWait
, por extensión) tiene, es esto:
[
FluentWait
(y, por extensión,WebDriverWait
)] puede tener su tiempo de espera e intervalo de sondeo configurados sobre la marcha.
[Citado de FluentWait .]
La clase
WebDriverWait
en Python está diseñada de tal manera que sus valores de configuración se establecen de una vez por todas cuando se crea.
FluentWait
permite
FluentWait
su configuración después de la creación.
Por lo tanto, un
solo
objeto
FluentWait
(o cualquier
WebDriverWait
en Java) podría reutilizarse para esperar diferentes condiciones con diferentes frecuencias de sondeo.
En Python, tendría que crear un nuevo objeto
WebDriverWait
para usar una frecuencia de sondeo diferente.
Entonces, hay algo que la implementación de Python no proporciona, pero no lo consideraría lo suficientemente significativo como para garantizar una implementación.