2012-05-25 8 views
7
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 

browser = webdriver.Firefox() 

browser.get("http://testsite.com") 

element = WebDriverWait(browser, 10).until(lambda browser : browser.find_element_by_id("element")) 

element.click() # it actually goes to page http://testsite.com/test-page.html 

print "Just clicked! And I'm expecting timeout error!" 

new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element")) 

print "Too bad there's no timeout error, why?!" 

OK, como se puede ver, incluso establezco el tiempo de espera en 0.1 segundos, todavía no se lanza una excepción de tiempo de espera. Cuando se ejecuta element.click(), no se bloquea hasta que toda la página se carga y es por eso que apareció Just clicked! And I'm expecting timeout error!, y para mi sorpresa new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element")) espere hasta que se cargue toda la página. Y si usa implicit waits, obtendrá el mismo resultado.¿Dime por qué esto no termina con un error de tiempo de espera (selenium 2 webdriver)?

Mi punto es que a veces, después de hacer clic en un elemento, puede demorar hasta unas horas para que una página se cargue debido a un mal proxy, y obviamente DO NOT desea esperar tanto tiempo, lo que quiere es una excepción de tiempo de espera. En este caso, ¿cómo lo harías funcionar?

Respuesta

4

Los clics tienen una espera implícita incorporada en ellos para esperar a que se cargue la página. Hay trabajo, actualmente completo solo en FirefoxDriver, que le permite establecer cuánto tiempo debe esperar el selenio para que se cargue una página.

Esto probablemente será en Selenio 2.22 para Python y luego el caso de test es probable que falle una vez que se establece

+0

No entiendo muy bien a qué te refieres. ¿Podrías por favor ser más específico y cómo puedo hacer eso? – Shane

+0

... y luego de actualizar a 2.22, me di cuenta de todos los lugares donde inconscientemente confié en esta espera implícita. XD – Isaac

+0

No creo que esto sea del todo correcto. Estás hablando de driver.set_page_load_timeout() Creo, sin embargo, eso no tiene que ver con los clics. No todos los clics activan una carga de página. El tiempo de carga de la página es solo para cargar la página. El interlocutor también está teniendo problemas con el tiempo de espera para encontrar el elemento (no es necesario que participen los clics). – Purrell

0

La Hasta método en espera WebDriver ignora el elemento no se encuentra una excepción y otras excepciones que occures en la condición de que especifique, para el período de tiempo que especifique. Después del tiempo dado, inicialmente obtendría una excepción de elemento no si no tiene el elemento presente y luego una excepción de tiempo de espera si maneja la excepción 'no dicho elemento' (preferiblemente en una captura de prueba).

Para su necesidad usted podría intentar un trabajo en torno a esta manera-

-> Poner el foco en el botón después de la cual hay una carga de la página -> Fuego el clic con el código de Java (no WebDriver desde clics. esperará a que se cargue la siguiente página.) -> Ponga un thread.sleep por un segundo o dos -> compruebe que el elemento esté prescente.

+0

no estoy seguro de cómo funciona con python. pero así es como va en Java ... – QVSJ

+0

Entiendo completamente tu trabajo, gracias amigo! Pero por lo que veo, el problema también vive con 'browser.find_element_by_id (" idstuff ")' también, lo que significa que en realidad NO comienza a verificar la presencia de ese elemento hasta que esa página esté completamente cargada, no sé qué punto está en este mecanismo, pero esto me molesta mucho ya que no tienes control sobre esto. – Shane

+0

Si aún no lo ha intentado, podría ver si obtiene algo aquí. (Especialmente el comentario 4 sonaba prometedor) de este enlace http://code.google.com/p/selenium/issues/detail?id=687 . Apareció después de una búsqueda aleatoria. No gauranties :) - – QVSJ

Cuestiones relacionadas