Esperando que una mesa se cargue completamente usando selenium con python

Quiero eliminar algunos datos de una página que está en una tabla. Así que solo me molesta la información en la tabla. Anteriormente estaba usando Mechanize, pero a veces descubrí que faltan algunos datos, especialmente en la parte inferior de la tabla. En Google, descubrí que puede deberse a que no se maneja Jquery / Ajax.

Así que me cambié a Selenium hoy. ¿Cómo puedo esperar que una y solo una tabla se cargue por completo y luego extraigo todos los enlaces de esa tabla usando selenium y python? Si espero a que se cargue la página completa, está tomando algo de tiempo. Quiero asegurarme de que solo se carguen los datos de la tabla. Mi código actual:

 driver = webdriver.Firefox ()
 Para página en rango (1, 2):
     driver.get ("http://somesite.com/page/" + str (página))
     table = driver.find_element_by_css_selector ('div.datatable')
     links = table.find_elements_by_tag_name ('a')
     para enlace en enlaces:
         imprimir link.text

Use WebDriverWait para esperar hasta que se WebDriverWait la tabla:

 from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC ... wait = WebDriverWait(driver, 10) table = wait.until(EC.presence_of_element_located(By.CSS_SELECTOR, 'div.datatable')) 

Esto sería una espera explícita .


Alternativamente, puede hacer que el controlador espere implícitamente :

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.

 from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) # wait up to 10 seconds while trying to locate elements for page in range(1, 2): driver.get("http://somesite.com/page/"+str(page)) table = driver.find_element_by_css_selector('div.datatable') links = table.find_elements_by_tag_name('a') for link in links: print link.text 

Quizás podría usar las condiciones esperadas de Selenium ( http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp ), por ejemplo

 >>> from selenium import webdriver >>> from selenium.webdriver.common.by import By >>> from selenium.webdriver.support.ui import WebDriverWait >>> from selenium.webdriver.support import expected_conditions as EC >>> >>> ff = webdriver.Firefox() >>> ff.get("http://www.datatables.net/examples/data_sources/js_array.html") >>> try: ... element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "example"))) ... print element.text ... finally: ... ff.quit() ... Engine Browser Platform Version Grade Gecko Firefox 1.0 Win 98+ / OSX.2+ 1.7 A Gecko Firefox 1.5 Win 98+ / OSX.2+ 1.8 A Gecko Firefox 2.0 Win 98+ / OSX.2+ 1.8 A Gecko Firefox 3.0 Win 2k+ / OSX.3+ 1.9 A Gecko Camino 1.0 OSX.2+ 1.8 A Gecko Camino 1.5 OSX.3+ 1.8 A Gecko Netscape 7.2 Win 95+ / Mac OS 8.6-9.2 1.7 A Gecko Netscape Browser 8 Win 98SE+ 1.7 A Gecko Netscape Navigator 9 Win 98+ / OSX.2+ 1.8 A Gecko Mozilla 1.0 Win 95+ / OSX.1+ 1 A