2016-05-02 16 views
-1

Ich lade Daten von einem Server (über Ajax) mit Hilfe von 3 Dropdown-Menüs ab. Ich möchte einen Integrationstest schreiben, bei dem ich auf die Beendigung der Ajax-Anfrage warten und dann einen Wert aus dem nächsten Dropdown-Menü auswählen muss.Warten Sie, bis der Ajax-Anruf für Capybara fertig ist.

Bis jetzt warte ich einige Sekunden, bevor ich die nächste Auswahl mache, aber das ist nicht zuverlässig und keine gute Lösung.

+0

https://robots.thoughtbot.com/write-reliable-asynchronous-integration-tests-with-capybara –

Antwort

0

Ich habe erkannt, dass Capybara (neueste Version) standardmäßig auf den Ajax wartet, um abzuschließen, dann die nächste Zeile im Code ausführen. Ich musste nichts tun, nur eine Auswahl nach der anderen.

select 'VW', from: 'trademarks-dropdown' 
select 'Golf', from: 'models-dropdown' 
assert_equal 200, status_code 
+0

Hinweis: Capybara wartet nicht wirklich für Ajax komplett - es wartet auf die Option Element erscheinen. Es ist eine kleine Technik, aber wichtig zu verstehen, da Capybara nichts über die Anfragen des Browsers weiß, sondern nur weiß, was es auf der Seite sehen kann und was nicht. –

0

Capybara wartet automatisch auf Objekte, die auf einer Seite angezeigt werden, wenn Sie aufgefordert werden, mit ihnen zu interagieren. Wenn es nicht lange genug wartet, können Sie entweder Capybara.default_max_wait_time erhöhen oder die Option: wait an die meisten Finder/Aktionen übergeben.

Also, wenn Sie eine Auswahlbox von Ajax Laden können Sie nur

select('Item that is being loaded') 

und Capybara wird bis Capybara.default_max_wait_time Sekunden für eine Option mit dem Text zur Verfügung wartet bis zu wählen sein. Wenn das nicht lang genug für Ihre Anwendungen Reaktionszeit warten, können Sie tun

select('Item that is being loaded', wait: 10) 

, die dann auf 10 Sekunden für die Option warten, wird auf der Seite angezeigt werden und dann wählen

Verwandte Themen