java python selenium selenium-webdriver wait

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.