waits present presence_of_element_located page for expectedconditions python selenium-webdriver automation automated-tests

present - waits selenium python



Selenio waitForElement (11)

¿Cómo escribo la función para que Selenium espere una tabla con solo un identificador de clase en Python? Estoy teniendo un demonio de tiempo aprendiendo a usar las funciones del controlador web Python de Selenium.


Del PDF de documentación de Selenium :

import contextlib import selenium.webdriver as webdriver import selenium.webdriver.support.ui as ui with contextlib.closing(webdriver.Firefox()) as driver: driver.get(''http://www.google.com'') wait = ui.WebDriverWait(driver,10) # Do not call `implicitly_wait` if using `WebDriverWait`. # It magnifies the timeout. # driver.implicitly_wait(10) inputElement=driver.find_element_by_name(''q'') inputElement.send_keys(''Cheese!'') inputElement.submit() print(driver.title) wait.until(lambda driver: driver.title.lower().startswith(''cheese!'')) print(driver.title) # This raises # selenium.common.exceptions.TimeoutException: Message: None # after 10 seconds wait.until(lambda driver: driver.find_element_by_id(''someId'')) print(driver.title)


En caso de que esto ayude ...

En el Selenium IDE, agregué ... Comando: waitForElementPresent Target: // table [@ class = ''pln'']

Luego hice File> Export TestCase As Python2 (Web Driver), y me dio esto ...

def test_sel(self): driver = self.driver for i in range(60): try: if self.is_element_present(By.XPATH, "//table[@class=''pln'']"): break except: pass time.sleep(1) else: self.fail("time out")


Espero que esto ayude

from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.get(''www.url.com'') try: wait = driver.WebDriverWait(driver,10).until(EC.presence_of_element_located(By.CLASS_NAME,''x'')) except: pass


He hecho buenas experiencias usando:

  • time.sleep (segundos)
  • webdriver.Firefox.implicitly_wait (segundos)

El primero es bastante obvio: solo espera unos segundos para algunas cosas.

Para todos mis scripts de Selenium, el sleep () con unos segundos (rango de 1 a 3) funciona cuando los ejecuto en mi computadora portátil, pero en mi servidor el tiempo de espera tiene un rango más amplio, por lo que también uso implicitly_wait (). Usualmente uso implicitly_wait (30), que es realmente suficiente.

Una espera implícita es decirle a WebDriver que sondee el DOM durante un cierto período de tiempo cuando intente encontrar un elemento o elementos si no están disponibles de inmediato. La configuración predeterminada es 0. Una vez configurado, la espera implícita se establece para la vida de la instancia del objeto WebDriver.


Implementé lo siguiente para python para wait_for_condition ya que el controlador de selenio de python no admite esta función.

def wait_for_condition(c): for x in range(1,10): print "Waiting for ajax: " + c x = browser.execute_script("return " + c) if(x): return time.sleep(1)

para ser utilizado como

Espere que una llamada ExtJS Ajax no esté pendiente:

wait_for_condition("!Ext.Ajax.isLoading()")

Se establece una variable de Javascript

wait_for_condition("CG.discovery != undefined;")

etc.


Las vinculaciones de Python de Selenium 2 tienen una nueva clase de soporte llamada expected_conditions.py para hacer todo tipo de cosas, como probar si un elemento es visible. Está disponible aquí.

NOTA: el archivo anterior está en el tronco a partir del 12 de octubre de 2012, pero aún no en la descarga más reciente, que sigue siendo 2.25. Por el momento hasta que se publique una nueva versión de Selenium, puede guardar este archivo localmente por ahora e incluirlo en sus importaciones como he hecho a continuación.

Para hacer la vida un poco más simple, puede combinar algunos de estos métodos de condición esperados con el Selenium, wait until lógica para realizar algunas funciones muy útiles similares a las disponibles en Selenium 1. Por ejemplo, puse esto en mi clase base llamada SeleniumTest que todas mis clases de prueba de Selenium se extienden:

from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By import selenium.webdriver.support.expected_conditions as EC import selenium.webdriver.support.ui as ui @classmethod def setUpClass(cls): cls.selenium = WebDriver() super(SeleniumTest, cls).setUpClass() @classmethod def tearDownClass(cls): cls.selenium.quit() super(SeleniumTest, cls).tearDownClass() # return True if element is visible within 2 seconds, otherwise False def is_visible(self, locator, timeout=2): try: ui.WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.CSS_SELECTOR, locator))) return True except TimeoutException: return False # return True if element is not visible within 2 seconds, otherwise False def is_not_visible(self, locator, timeout=2): try: ui.WebDriverWait(driver, timeout).until_not(EC.visibility_of_element_located((By.CSS_SELECTOR, locator))) return True except TimeoutException: return False

A continuación, puede usar estos fácilmente en sus pruebas de esta manera:

def test_search_no_city_entered_then_city_selected(self): sel = self.selenium sel.get(''%s%s'' % (self.live_server_url, ''/'')) self.is_not_visible(''#search-error'')


Puede modificar esta función para todo tipo de elementos. El siguiente es solo para el elemento de clase:

Donde "conductor" es el controlador, "element_name" es el nombre de clase que está buscando, y "sec" es la cantidad máxima de segundos que está dispuesto a esperar.

def wait_for_class_element(driver,element_name,sec): for i in range(sec): try: driver.find_element_by_class_name(element_name) break except: print("not yet") time.sleep(1)


Si no sé algo sobre el comando de selenio, uso la idea RC de selenio web con Firefox. Puede elegir y agregar un comando en el cuadro combinado y cuando termine su caso de prueba después de que pueda exportar el idioma diferente del código de prueba. como java, ruby, phyton, C #, etc.


Siempre puedes usar un breve descanso en un bucle y pasarle el ID de tu elemento:

def wait_for_element(element): count = 1 if(self.is_element_present(element)): if(self.is_visible(element)): return else: time.sleep(.1) count = count + 1 else: time.sleep(.1) count = count + 1 if(count > 300): print("Element %s not found" % element) self.stop #prevents infinite loop


Use Wait Until Page Contains Element con el localizador XPath adecuado. Por ejemplo, dado el siguiente HTML:

<body> <div id="myDiv"> <table class="myTable"> <!-- implementation --> </table> </div> </body>

... puede ingresar la siguiente palabra clave:

Wait Until Page Contains Element //table[@class=''myTable''] 5 seconds

A menos que me haya perdido algo, no hay necesidad de crear una nueva función para esto.


solución más fácil:

from selenium.webdriver.common.by import By import time while len(driver.find_elements(By.ID, ''cs-paginate-next''))==0: time.sleep(100)