es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, recomiendo utilizar una espera explícita con la función WebDriverWait del módulo selenium.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étodo invisibility_of_element no está funcionando como se esperaba.

    En lugar de utilizar invisibility_of_element, sugiero utilizar presence_of_element_located para esperar hasta que el div del cargador esté presente en la estructura de la página, y luego utilizar invisibility_of_element_located para esperar a que desaparezca. Aquí está el fragmento de código actualizado:

    # Espera a que el botón sea clickeable
    action.click()
    action.perform()
    wait = WebDriverWait(driver, 30)
    wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@class='export']")))
    
    # Espera a que desaparezca el cargador
    print("Esperando a que desaparezca el cargador")
    wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='loader']")))
    wait.until(EC.invisibility_of_element_located((By.XPATH, "//div[@class='loader']")))
    print("El cargador desapareció")
    
    # Clickea el botón para exportar los datos
    driver.find_element_by_xpath("//button[@class='export']").click()
    

    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 utilizando invisibility_of_element_located. El uso de presence_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 declaraciones print 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.

Comments are closed.