2013-11-01 7 views
8

Najwyraźniej sleep lub wait_until nie są prawidłowe przy użyciu najnowszych wersji Capybara, zgodnie z webpageupdates.Czy Capybara wymaga snu do pracy?

Jednak mam zestaw testów, które działają tylko na szybkich komputerach, jeśli dodaję do testu połączenie sleep(1). To jest test, który wygląda następująco:

describe "dosimeters page" do 
    before do 
    click_link("Dosimeter Read History", :match=>:first) 
    end 
... 

staje

describe "dosimeters page" do 
    before do 
    unix_wait 
    click_link("Dosimeter Read History", :match=>:first) 
    end 
... 

gdzie mam zdefiniowane unix_wait jak:

def unix_wait 
    case RbConfig::CONFIG['host_os'] 
    when /darwin/ 
    when /linux-gnu/ 
    sleep(1) 
    end 
end 

Chodzi o to, mam starą Ubuntu 12.04 QuadCore laptop uruchamiający te testy na Jenkins i wszystko działa dobrze na nim bez wywołań unix_wait. Testy nie powiodły się losowo na szesnastkowym pulpicie z systemem Ubuntu 13.10 i na macbook pro laptopie, ale jeśli dodam połączenie unix_wait, testy mijają.

Same niepowodzenia testów wskazują na ładowanie błędów (np. Brak elementów css w niektórych seriach, ale nie na innych), a rzeczy testowane faktycznie działają, gdy strona jest ładowana ręcznie.

Jakie jest właściwe działanie? Najwyraźniej sleep nie jest dozwolone podczas testowania, ani nie jest wait_until. Jednak sen działa, ale wydaje mi się to bardzo surowe. Czy powinienem patrzeć na #synchronized? Z tego, co zbieram z tych postów na blogu, jest już wywoływana, gdy dzwonię pod numer click_link, a testy nadal nie działają.

Jaki jest tutaj zaakceptowany protokół?

Powinienem dodać, ponieważ uważam, że to ważne: to są wszystkie testy javascript. Używam capybara-webkit zbudowanego na qt4 (nie qt5). Rozważam przejście na poltergeist lub inny sterownik javascript jako etap debugowania.

+0

Możesz spróbować użyć webdrivera do debugowania, ale mam podobne problemy. –

+0

Mam ten sam problem z capybara-webkit, kiedy używam ajax. Nie wiem, czy poltergeist mógłby rozwiązać ten problem, ale warto spróbować. – basgys

+0

Czy możesz wyjaśnić więcej błędów, które widzisz? Nie jestem pewien, co naprawdę oznacza "brakujące elementy css". – Shepmaster

Odpowiedz

4

Jeśli jeszcze tego nie zrobiłeś, w teście potwierdzającym, jeśli sprawdzisz zawartość strony, poczekasz na ustawiony czas, zanim ta zawartość stanie się dostępna.

Więc zamiast dodanie snu można dodać coś

expect(page).to have_content 'Success' 

Kapibara pomieścić Ajax i załadunku elementów itp więc będzie poczekać niejawnie podczas sprawdzania zawartości.

Możesz zmienić domyślny czas oczekiwania, jeśli trzeba, aby umożliwić ładowanie elementów, które znasz może trwać dłużej tzn 3rd zapytań partying/loginów

Capybara.default_wait_time = 5 
+1

Kapibara _dobrze przyjmować Ajax, ale nie jestem do końca pewien, że tak jest, ponieważ są to awarie podczas używania ': js => true' podczas testowania. Zmiana 'default_wait_time' tak naprawdę nie pomaga, ale czasami' save_and_open_page' rozwiązuje problem (choć powoduje to, że okno przerywa pracę). – mmr

+0

Asta ma rację, problem polega na tym, że nie uruchamiasz mechanizmu oczekiwania Capybary, ponieważ nie sprawdzasz zawartości. Asta wspomina o sprawdzeniu 'have_content', a ty nie robisz czegoś takiego. – kross

+0

To jest również odpowiedź tutaj: http://stackoverflow.com/a/20003280/2363935 – kross

0

Dobrą alternatywą wait_until i sleep jest using_wait_time An przykład którego pokazano poniżej.

using_wait_time 5 do 
    page.should have_content '<content>' 
end 

Możesz także ponownie załadować stronę, po czym możesz sprawdzić, jakie masz warunki. To działa dla mnie czasami.

visit current_url