FluentWait de Java en Python

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 se verifica 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 la 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 python selenium , o debería implementarlo yo mismo?

(He revisado la documentación de Waits – no hay nada allí).

Creo que puedes hacer esto con Python, sin embargo, no está empaquetado tan simplemente como una clase FluentWait. Algo de esto fue cubierto en la documentación que proporcionó no extensivamente.

La clase WebDriverWait tiene argumentos opcionales para timeout, poll_frequency y ignored_exceptions. Así que podrías suministrarlo allí. Luego combínelo con una Condición esperada para esperar a que aparezcan los elementos, se pueda 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 de espera en una sola statement, pero de esta forma puedo ver dónde se implementa.

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ícita y explícita. FluentWait no es algo adicional a estos dos tipos de espera. Es sólo una espera explícita.

¿Hay algo similar en el paquete python selenium, o debería implementarlo yo mismo?

Lo único que se me ocurre es que falta en la implementación de WebDriverWait de Python que tiene FluentWait (y WebDriverWait , por extensión), es esto:

[ FluentWait (y, por extensión, WebDriverWait )] puede tener su tiempo de espera e intervalo de sondeo configurados sobre la marcha.

[Citado de esto .]

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.

Así que hay algo que la implementación de Python no proporciona, pero no lo consideraría lo suficientemente importante como para justificar una implementación.

La implementación anterior no funcionó bien en mi caso de uso, así que compartiría mi implementación también. Para esperar con fluidez, también es bueno verificar algunos otros criterios al sondear, por ejemplo, podemos verificar si ha cambiado el atributo de un elemento. Por lo tanto, 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 bucle y 5 veces por cada 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')