2011-11-17 14 views
6

Używam kapibara do testowania aplikacji mojej szyny do testowania integracji. W mojej aplikacji jest wiele wywołań Lightbox i Ajax oraz js.Jak dodać czas oczekiwania w scenariuszach kapibara?

@javascript 
    Scenario: I agree functionatilty 
    Given I go to the create account page 
    When I click on button which is given as image "lnkTerms2" 
    And I follow "i_agree" 
    Then I go to the create account page 

Tutaj w powyższym kodzie lnkTerms2 jest i id, które pomogą w wywołanie funkcji js otworzyć schowek. a ja otrzymuję błąd jak

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotDisplayedError) 
     [remote server] resource://fxdriver/modules/atoms.js:9519:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:256:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:305:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:320:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:197:in `unknown' 
     (eval):2:in `send' 
     (eval):2:in `click_link' 
     ./features/step_definitions/web_steps.rb:300:in `/^I click on button which is given as image "([^"]*)"$/' 
     features/Sign_up_process.feature:61:in `When I click on button which is given as image "lnkTerms2"' 

Problem jest taki, jak tę funkcję zwaną w webdriver, nie jest uzyskiwanie czas ładowania javascript i ajax połączeń. Lightbox nie otwiera się. Więc proszę zasugeruj mi jakieś rozwiązanie.

Także jeśli Załóżmy, że napisać linia

When I click on button which is given as image "lnkTerms2" 

po 4 do 5 wypowiedzi to jest to działa dobrze, jak robi się czas ładowania JS.

Odpowiedz

3

Do przerwy po kroku czekać ajax spróbować:

And I wait 5 seconds 

ustawień należy dodać do web_steps.rb następny kod:

When /^I wait (\d+) seconds?$/ do |seconds| 
    sleep seconds.to_i 
end 
+4

To nie jest dobre rozwiązanie, dodaje wymuszone opóźnienie do wykonania testu, jeśli jest ono ponownie używane, może to zająć dużo czasu. Właściwym sposobem rozwiązania tego problemu jest oczekiwanie, aż element będzie widoczny. – Benja

+4

żadna forma ustalonego trybu uśpienia, nawet jeśli przyjmuje wartość ze scenariusza, jest na ogół okropnym pomysłem, chyba że scenariusz dotyczy w rzeczywistości wrażenia użytkownika wymagającego tego określonego czasu (w przeciwieństwie do oczekiwania na aktualizację ekranu itp. , np. "synchronizacja") –

1

Oczekiwanie na ustaloną liczbę sekund w nadziei, że scenariusz będzie wystarczająco szybki, nie jest najlepszą strategią, ponieważ może prowadzić do losowych testów. Polecam czekać, aż jakiś warunek jest spełniony zamiast:

And I wait until '#meow' is visible 

#... 
When /^I wait until '([^']+)' is visible$/ do |selector| 
    wait_until do # you can also specify timeout here 
    find(selector).visible? 
    end 
end 
+7

wait_until nie jest dostępny w Capybara 2 –

+0

Jednak ogólny punkt dotyczący trwałego oczekiwania jest zły. Zobacz dyskusję tutaj: https://groups.google.com/forum/?fromgroups=#!topic/ruby-capybara/qQYWpQb9FzY, dlaczego usunęli wait_until .. –

+2

'find (selector)' wystarcza zamiast tego 'wait_until 'block if' Capybara.ignore_hidden_elements = true'. Jeśli jest to fałsz, można użyć 'find (selector, visible: true)' –

12

Ogólnie stałe Sleeps/oczekiwania są złe .. Są podejście brute force, że zarówno wyniki w skryptach kruchych, powolne skryptów, a często jedno i drugie. Jeśli nie ustawisz ich wystarczająco długo, od czasu do czasu testy się zepsują, jeśli ustawisz je zbyt długo, testy nigdy się nie zepsują, ale będą WOLNE ze względu na stały czas kciuka.

Większość narzędzi automatyzacji albo zająć się automagicznie czekając, czy zapewniają one bardziej wdzięczne sposoby zsynchronizować skryptów z aplikacji

A recent blog posting by JNicklas explanes kilka ostatnich zmian Kapibara w tym zakresie, niektóre przykłady niektórych sposobów Wykonaj specyficzny kod typu wait-for-condition dla kilku specjalnych przypadków, a ogólnie zaleca się dowiedzieć się więcej o narzędziu i sposobie, w jaki zajmuje się oczekiwaniem na rzeczy, działaniami ajax i synchronizacją.

Powiązane problemy