2010-02-03 12 views
5

Wir laufen Webrat mit Selenium2.0 aka WebDriver in unserer Anwendung.WebRat + Selenium WebDriver: Warten auf Ajax abgeschlossen werden

WebDriver verarbeitet die Seite sehr gut und startet die nächsten Schritte nicht, wenn der Browser die gesamte Seite neu lädt. Das Problem ist, dass dieser Mechanismus nicht mit Ajax-Anfragen funktioniert. WebDriver macht keinen Leerlauf, wenn es nach dem Klick() oder dem Ändern() etwas gibt.

Kann jemand vorschlagen, wie man Webdriver im Leerlauf bis zum Ende aller Ajax-Anfragen auf der Seite macht?

Antwort

3

Wir haben am Ende eine Schicht über Selen geschrieben, die dieses Szenario behandelte, indem die Aufrufe in eine optionale Schleife eingeschlossen wurden. Also, wenn Sie tun würde:

@browser.click "#my_button_id" 

es etwas tun würde, ähnlich dem, was AutomatedTester oben vorgeschlagen:

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 

der Wrapper auch dazu noch andere Dinge, wie so dass durch die Taste/Eingabe-Label suchen usw. (also gab es den Wrapper nicht nur für die Timing-Probleme, das war nur eines der Dinge, die wir dort hineingesteckt haben.)

1

Entschuldigung mein Ruby, aber was Sie tun müssen, ist versuchen, das Objekt zu finden, und wenn es nicht dort ist, warten Sie einfach darauf, dass es zurückkommt. Was unten sollte der Code tun Schleife für eine Minute jede Sekunde warten versuchen, zu sehen, ob der Fahrer das Element mit der ID idOfElement finden und dann, wenn es nicht kann, sollte sie einen Fehler

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

Ja, das würde funktionieren, aber Sie müssen angeben, worauf Sie bei jeder Ajax-Anfrage warten . Ich glaube, es sollte einen besseren Weg geben. –

0

Ein separater MTD werfen (wrapper) um nach dem Element mit einer Wartezeit zu suchen sollte helfen.