2012-05-25 5 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, come è possibile vedere anche se imposto il tempo di attesa su 0,1 sec non c'è ancora un'eccezione di timeout generata. Quando viene eseguito element.click(), non viene bloccato fino a quando non viene caricata l'intera pagina e questo è il motivo per cui è stato visualizzato Just clicked! And I'm expecting timeout error! e con mia sorpresa new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element")) attendi fino a quando l'intera pagina non viene caricata. E se usi implicit waits, ottieni lo stesso risultato.Dimmi perché questo non termina con un errore di timeout (selenio 2 webdriver)?

Il mio punto è, a volte dopo aver fatto clic un elemento che potrebbe richiedere fino a ore, anche per una pagina per caricare a causa di una cattiva proxy e ovviamente NON vuole aspettare così a lungo, quello che vuoi è un'eccezione di timeout. In questo caso, come faresti a farlo funzionare?

risposta

4

I clic hanno un'attesa implicita incorporata per attendere quando la pagina viene caricata. C'è del lavoro, attualmente completo solo in FirefoxDriver, che ti permette di impostare per quanto tempo il Selenium dovrebbe aspettare il caricamento di una pagina.

Questo sarà probabilmente in selenio 2.22 per Python e quindi il banco di prova sarà probabilmente fallire una volta che è impostato

+0

Non capisco cosa intendi. Vuoi essere più specifico e come posso farlo? – Shane

+0

... e con l'aggiornamento a 2.22, mi sono reso conto di tutti i posti in cui inconsciamente facevo affidamento su questa attesa implicita. XD – Isaac

+0

Non penso che sia giusto. Stai parlando di driver.set_page_load_timeout() credo, ma ciò non ha a che fare con i clic. Non tutti i clic attivano il caricamento di una pagina. Il tempo di caricamento della pagina è solo per il caricamento della pagina. Anche l'interrogante ha problemi con il timeout semplicemente nel trovare l'elemento (non occorre coinvolgere alcun clic). – Purrell

0

Il Fino metodo su WebDriver attesa ignora l'elemento non trovato eccezione e altre eccezioni che occures nella condizione che si specificare, per il periodo di tempo specificato. Dopo un certo periodo di tempo, inizialmente non riceverai alcuna eccezione di tale elemento se non hai l'elemento presente e quindi un'eccezione di timeout se gestisci l'eccezione 'no such element' (preferibilmente in un try catch).

Per la vostra necessità si potrebbe provare un lavoro intorno a questo modo-

-> Portare l'attenzione al pulsante dopo il quale c'è una pagina di carico -> Fuoco il clic con il codice Java (non WebDriver dal clic. attenderà il caricamento della pagina successiva.) -> Metti un thread.sleep per un secondo o due -> verifica la presenza del componente.

+0

non so come funziona con python. ma questo è come va in java .. – QVSJ

+0

Capisco perfettamente il tuo lavoro, grazie amico! Ma da quello che vedo il problema vive in genere con 'browser.find_element_by_id (" idstuff ")', il che significa che NON inizia effettivamente a controllare la presenza di quell'elemento finché la pagina non è completamente caricata, non so quale punto è in questo meccanismo, ma questo mi infastidisce molto perché non ne hai il controllo. – Shane

+0

Se non lo hai ancora provato, potresti vedere se ottieni qualcosa qui (il commento 4 sembra promettente) di questo link http://code.google.com/p/selenium/issues/detail?id=687 . È venuto dopo una ricerca casuale. No gauranties :) - – QVSJ