2010-09-12 23 views

risposta

9

Attualmente non è possibile utilizzare wait_for_condition con WebDriver. Il codice del selenio pitone fornisce la classe DrivenSelenium per accedere ai vecchi metodi di selenio, ma non può attendere wait_for_condition. The selenium wiki has some info on that.

La soluzione migliore è utilizzare la classe WebDriverWait. Questa è una classe helper che esegue periodicamente una funzione in attesa che restituisca True. Il mio uso generale è

driver = webdriver.Firefox() 
driver.get('http://example.com') 
add = driver.find_element_by_id("ajax_button") 
add.click() 
source = driver.page_source 

def compare_source(driver): 
    try: 
     return source != driver.page_source 
    except WebDriverException: 
     pass 

WebDriverWait(driver, 5).until(compare_source) 
# and now do some assertions 

Questa soluzione non è affatto ideale .. Il try/tranne che è necessario per le situazioni in cui il ciclo di richiesta di pagina/risposta è ritardata in attesa di qualche attività di ajax per completare. Se compare_source viene chiamato nel mezzo del ciclo di richiesta/risposta, genererà un'eccezione WebDriverException.

Il test coverage for WebDriverWait è anche utile da guardare.

+0

Sembra che tu possa testare la visibilità. 'da selenium.webdriver.support importate condizioni_aspese come ec' e quindi' ec.visibility_of (elm) '. L'oggetto di ritorno è "selenium.webdriver.support.expected_conditions.visibility_of', ma non ho capito come ottenerne la visibilità. – huggie

0

L'associazione Java include una classe Wait. Questa classe controlla ripetutamente una condizione (con sleeps tra) fino al raggiungimento di un timeout. Se riesci a rilevare il completamento del tuo Javascript utilizzando la normale API, puoi seguire lo stesso approccio.

2

Ecco la mia versione della risposta di Greg Sadetsky, messo in una funzione:

def click_n_wait(driver, button, timeout=5): 
    source = driver.page_source 
    button.click() 
    def compare_source(driver): 
     try: 
      return source != driver.page_source 
     except WebDriverException: 
      pass 
    WebDriverWait(driver, timeout).until(compare_source) 

Si fa clic sul pulsante, attende il DOM di cambiare e poi ritorna.