select_by_value - Python Selenium: no espera hasta que la página se carga después de un comando click()
wait for page to load selenium python (2)
Aquí está mi versión que he usado:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def waitForLoad(inputXPath):
Wait = WebDriverWait(browser, PATIENCE_TIME)
Wait.until(EC.presence_of_element_located((By.XPATH, inputXPath)))
La línea superior en la función es una espera genérica. La segunda es una condición esperada en la que está tratando de encontrar un elemento que sabe que existe en la página. Puede cambiarlo, así que en lugar de Xpath hace CSS_SELECTOR, NAME, ID, CLASS, etc. Hay muchos otros, pero tendrá que buscar la documentación de condiciones esperadas. Espero que eso haya ayudado, me ayudó cuando lo descubrí.
¿Alguien sabe esperar hasta que la página esté cargada? Probé todas las variantes posibles que encontré en la web, pero simplemente no funciona.
Necesito esperar después de que active un comando click (), hay algunas secuencias de comandos internas en el servidor web que no permiten las comprobaciones (por ejemplo, excluyo el código para importar los módulos necesarios y usar las convenciones de nombres estándar):
WebDriverWait(browser, 10).until(lambda d: d.find_element_by_id(the_id))
o
browser.implicitly_wait(10)
o
elem2=wait.until(EC.presence_of_element_located((By.ID,the_id)))
todas las comprobaciones anteriores no funcionan, en el sentido de que devuelven True incluso si la página aún se está cargando. Esto hace que el texto que estoy leyendo esté incompleto ya que la página no está completamente cargada después de un comando click (). Parece que en python el comando clickAndWait no está disponible (pero, de nuevo, probablemente no resolvería el problema ya que las otras pruebas también fallan). Lo ideal es que haya un comando que espere hasta que se cargue toda la página web (independientemente de un elemento particular de la página).
Logré resolver el problema insertando manualmente un time.sleep (5) en un bucle, pero esto no es óptimo ya que podría ralentizar todo el proceso. Si es posible, es mejor esperar solo el tiempo estrictamente requerido.
Gracias
Fundamentalmente, si la página está siendo generada por JavaScript, entonces no hay forma de saber cuándo ha "terminado" la carga.
Sin embargo. Por lo general, trato de recuperar un elemento de la página, detectar la excepción y seguir intentando hasta que se alcanza un tiempo de espera. También podría comprobar que el elemento es visible, no simplemente presente.
Debe haber algún elemento DOM cuya visibilidad se pueda usar para probar que una página ha "terminado" de cargarse. Normalmente tengo una función wait_for_element_visibility
, y wait_for_element_presence
en mis casos de prueba.
def wait_for_visibility(self, selector, timeout_seconds=10):
retries = timeout_seconds
while retries:
try:
element = self.get_via_css(selector)
if element.is_displayed():
return element
except (exceptions.NoSuchElementException,
exceptions.StaleElementReferenceException):
if retries <= 0:
raise
else:
pass
retries = retries - 1
time.sleep(pause_interval)
raise exceptions.ElementNotVisibleException(
"Element %s not visible despite waiting for %s seconds" % (
selector, timeout_seconds)
)
get_via_css
es una de mis funciones, pero espero que esté bastante claro lo que está haciendo.