Esperas Explicitas de Selenium para invisibility_of_element() no esperando en absoluto.
Estoy intentando hacer que Selenium espere hasta que un div de carga sea invisible.
Estos son mis importaciones:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.support.ui import expected_condition as EC
Primero hago clic en un botón para abrir una ventana emergente con datos de tabla.
action.click()
action.perform()
Después de hacer clic, tengo que esperar hasta que pueda presionar un botón para exportar estos datos en un archivo. Sin embargo, el tiempo que tengo que esperar varía enormemente. A veces 10 segundos, a veces unos minutos. Mientras se carga esta sección, aparece un loader que me impide hacer clic en cualquier lugar de la pantalla.
Estoy intentando hacer que Selenium espere hasta que este loader desaparezca. Sin embargo, por alguna razón, el script no espera en absoluto. Ni siquiera el tiempo máximo, que se pasa a la función de espera explícita.
time.sleep(10)
print(“Esperando botón”)
espera = WebDriverWait(driver, 30) #Solo estoy probando con 30, será un valor más grande
espera.until(EC.invisibility_of_element((By.XPATH, “//div[@class=’loader’]”)))
print(“Terminó de esperar al botón”)
driver.find_element_by_xpath(“//button[@class=’export’]”).click()
davy.ai
Para resolver este problema, recomiendo utilizar una espera explícita con la función
WebDriverWait
del móduloselenium.webdriver.support.ui
. En los fragmentos de código proporcionados, ya se está utilizando una espera explícita, pero parece que no está funcionando correctamente. Una posible razón para esto podría ser que el métodoinvisibility_of_element
no está funcionando como se esperaba.En lugar de utilizar
invisibility_of_element
, sugiero utilizarpresence_of_element_located
para esperar hasta que el div del cargador esté presente en la estructura de la página, y luego utilizarinvisibility_of_element_located
para esperar a que desaparezca. Aquí está el fragmento de código actualizado:En esta versión actualizada, primero esperamos a que el botón sea clickeable como antes. Luego, esperamos a que el cargador esté presente en la estructura HTML utilizando
presence_of_element_located
, seguido de la espera para que desaparezca utilizandoinvisibility_of_element_located
. El uso depresence_of_element_located
asegura que la espera solo comenzará después de que el div del cargador haya sido completamente cargado en el DOM. Las declaracionesprint
se incluyen con fines de depuración y se pueden eliminar una vez que el código se haya probado y funcione como se esperaba.¡Espero que esto ayude! Háganme saber si tienen alguna pregunta adicional.