2010-02-03 6 views
5

Stiamo utilizzando Webrat con Selenium2.0 ovvero WebDriver nella nostra applicazione.WebRat + Selenium WebDriver: attendere il completamento di ajax

WebDriver gestisce il ricaricamento della pagina molto bene e non avvia i passaggi successivi se il browser sta ricaricando l'intera pagina. Il problema è che questo meccanismo non funziona con le richieste Ajax. WebDriver non funziona in modo inattivo quando ci sono alcuni dopo clic() o modifica().

Qualcuno può suggerire come rendere inattivo il webdriver fino alla fine di tutte le richieste Ajax sulla pagina?

risposta

3

Abbiamo finito per scrivere uno strato sul selenio che gestiva questo scenario avvolgendo le chiamate in un ciclo opzionale. Quindi, quando si farebbe:

@browser.click "#my_button_id" 

sarebbe fare qualcosa di simile a ciò che AutomatedTester suggerito sopra:

class Browser 
    def click(locator) 
    wait_for_element(locator, :timeout => PAGE_EVENT_TIMEOUT) 
    @selenium.click(locator) 
    end 

    def wait_for_element(locator, options) 
    timeout = options[:timeout] || PAGE_LOAD_TIMEOUT 
    selenium_locator = locator.clone 
    expression = <<EOF 
     var element; 
     try { 
     element = selenium.browserbot.findElement('#{selenium_locator}'); 
     } catch(e) { 
     element = null; 
     }; 
     element != null; 
EOF 
    begin 
     selenium.wait_for_condition(expression, timeout) 
    rescue ::Selenium::SeleniumException 
     raise "Couldn't find element with locator '#{locator}' on the page: #{$!}.\nThe locator passed to selenium was '#{selenium_locator}'" 
    end 
    end 
end 

l'involucro ha fatto anche altre cose, come che permette di cercare per l'etichetta del pulsante/ingresso etc . (quindi il wrapper non esisteva solo per i problemi di temporizzazione, questa era solo una delle cose che abbiamo inserito.)

1

Scusa il mio Ruby ma quello che devi fare è provare a trovare l'oggetto e se non è lì aspetta solo che ritorni. Quello che il codice qui sotto dovrebbe fare è aspettare ciclo ogni secondo per un minuto cercando di vedere se il guidatore può trovare l'elemento con l'ID idOfElement e quindi se può non dovrebbe gettare un errore

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 } 
+0

Sì, funzionerebbe, ma devi specificare cosa stai aspettando in ogni richiesta Ajax . Credo che ci dovrebbe essere un modo migliore. –

0

A MTD separata (wrapper) per verificare l'elemento con un'attesa dovrebbe aiutare.