Selenio waitForElement

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

De la Documentación de Selenium PDF :

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) 

Los enlaces 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 troncal a partir del 12 de octubre de 2012, pero aún no se encuentra en la última descarga, que aún es 2.25. Por el momento, hasta que se lance una nueva versión de Selenium, puedes guardar este archivo localmente por ahora e incluirlo en tus importaciones como lo he hecho a continuación.

Para simplificar un poco la vida, puede combinar algunos de estos métodos de condición esperada con el Selenium. wait until lógica haga algunas funciones muy útiles similares a las que estaban disponibles en Selenium 1. Por ejemplo, puse esto en mi clase base llamada SeleniumTest, que todas mis clases de prueba de Selenium 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 

Puedes usarlos fácilmente en tus 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') 

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 modo de suspensión () 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, así que uso implícitamente_wait () también. Usualmente uso implícitamente esperar (30), que es realmente suficiente.

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

Implementé lo siguiente para python for wait_for_condition ya que el controlador de python selenium 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 a 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.

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

  

… 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.

En caso de que esto ayude …

En el IDE de Selenium, agregué … Comando: waitForElementPresent Target: // table [@ class = ‘pln’]

Luego hice Archivo> Exportar TestCase As Python2 (controlador web), 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") 

Siempre se puede usar una suspensión corta en un bucle y pasarle su ID de 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 

Esperemos 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 

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

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) 

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

Donde “driver” es el controlador, “element_name” es el nombre de la 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)