2013-11-15 17 views
5

Ich schreibe ein automatisiertes Testprogramm, das einige Web-Programme testen wird, die manchmal langsam sind, um bestimmte AJAX-Aufrufe zu laden. Zum Beispiel wird der Benutzer auf "Abfrage" klicken, was zu einem HTML "Laden" Overlay für 15 bis 90 Sekunden führen wird. Wenn die Suche abgeschlossen ist, aktualisiert sie eine Tabelle auf derselben Seite mit den Ergebnissen.Ist es möglich Watir-Webdriver global zu erhöhen, wenn die Wartezeit abgelaufen ist?

So offensichtlich kann ich die Wartezeit individuell wie so zu erhöhen:

browser.td(:id => 'someId').when_present.some_action #=> will wait 30 seconds 
browser.td(:id => 'someId').when_present(90).some_action #=> will wait *90* seconds 

Aber ist es eine Möglichkeit, (in meinem Fall zu erhöhen), die Zeit zu ändern, so Watir-WebDriver immer 90 Sekunden auf .when_present warten so wie:

browser.some_default = 90 
browser.td(:id => 'someId').when_present.some_action #=> will wait *90* seconds 

Ein paar Worte der Warnung: Client timeout will not affectwhen_present. Nor will implicit wait.

Antwort

9

Update: Dieser Affe-Patch wurde in den watir-webdriver integriert und wird daher nicht mehr in watir-webdriver v0.6.5 benötigt. Sie werden mit dem Timeout zu setzen in der Lage:

Watir.default_timeout = 90 

Die wait methods zu ähnlich definiert:

def when_present(timeout = 30) 
    message = "waiting for #{selector_string} to become present" 

    if block_given? 
    Watir::Wait.until(timeout, message) { present? } 
    yield self 
    else 
    WhenPresentDecorator.new(self, timeout, message) 
    end 
end 

Wie Sie das Standard-Timeout von 30 Sekunden sehen können, hartcodiert ist. Daher gibt es keinen einfachen Weg, es überall zu ändern.

Sie könnten jedoch Affe Patch die Warte-Methoden, um eine Standardzeit und stellen Sie es auf was Sie wollen. Der folgende Monkey-Patch setzt das Standard-Timeout auf 90 Sekunden.

require 'watir-webdriver' 
module Watir 

    # Can be changed within a script with Watir.default_wait_time = 30  
    @default_wait_time = 90 
    class << self 
    attr_accessor :default_wait_time  
    end 

    module Wait 

    class << self 
     alias old_until until 
     def until(timeout = Watir.default_wait_time, message = nil, &block) 
     old_until(timeout, message, &block) 
     end 

     alias old_while while 
     def while(timeout = Watir.default_wait_time, message = nil, &block) 
     old_while(timeout, message, &block) 
     end 

    end # self 
    end # Wait 

    module EventuallyPresent 

    alias old_when_present when_present 
    def when_present(timeout = Watir.default_wait_time, &block) 
     old_when_present(timeout, &block) 
    end 

    alias old_wait_until_present wait_until_present 
    def wait_until_present(timeout = Watir.default_wait_time) 
     old_wait_until_present(timeout) 
    end 

    alias old_wait_while_present wait_while_present 
    def wait_while_present(timeout = Watir.default_wait_time) 
     old_wait_while_present(timeout) 
    end 

    end # EventuallyPresent 
end # Watir 

Fügen Sie den Patch hinzu, nachdem der Webtreibercode von watir geladen wurde.

+0

Newish zu Ruby und hatte nicht viel vorher ausgedehnt. Dies scheint für mich perfekt zu funktionieren und war genau das Richtige für mich. Vielen Dank! – Sam

+2

Anstelle des Affepatchings können Sie natürlich eine Pull-Anfrage an den Web-Treiber senden, der diese Änderung vorschlägt. – jarib

Verwandte Themen