2012-08-24 10 views
15

Mam aplikację sieci Web, która nieprzerwanie odpytuje na dane z serwera przy użyciu żądań Ajax. Chciałbym zaimplementować test integracji za pomocą zombie.js.Jak korzystać z browser.wait() w zombie.js?

Próbuję poczekać, aż pętla anonimowa otrzyma dane z serwera. Dane powinny zostać odebrane po 20 sekundach, więc używam browser.wait(done, callback), aby sprawdzić, czy dane tam są, i ustawić waitFor na maksymalny limit czasu wynoszący jedną minutę.

Jednak browser.wait() zawsze zwraca prawie natychmiast, nawet jeśli mój callback zwrotny done zwraca wartość false.

W zombie API documentation, czytałem o browser.wait() następujące:

... to nie może czekać w nieskończoność, zwłaszcza nie dla timerów, które mogą ogień wielokrotnie (na przykład sprawdzanie stanu strony, długo odpytywania).

Sądzę, że to jest powód zachowania, które widzę, ale tak naprawdę nie rozumiem, co się dzieje. Dlaczego nie mogę poczekać minutę, dopóki moja pętla ankietowa nie odbierze danych z serwera? Dlaczego browser.wait() nie może czekać na zegary, które mogą wielokrotnie strzelać? Co muszę zrobić, aby wdrożyć mój test?

+0

Czy odkryłeś coś nowego w tej sprawie? –

+0

Po prostu upewnij się, że używasz milisekund dla 'waitFor', prawda? Mówię o doświadczeniu;) Nie zapomnij też o 'maxWait'. – robertklep

+0

"ciągłe ankiety dla danych z serwera" - jeśli masz nad tym kontrolę, 'socket.io' będzie doskonałą alternatywą – jcollum

Odpowiedz

2

Zombie.js domyślnie czeka, aż wszystkie skrypty na twojej stronie zostaną załadowane i wykonane, jeśli czekają na gotowy dokument.

Jeśli dobrze Cię rozumiem, Twój skrypt nie zostanie wykonany aż do 20 sekund od przygotowania dokumentu. W takim przypadku Zombie ma funkcję, która pozwoli ci ocenić javascript w kontekście przeglądarki, dzięki czemu możesz przyspieszyć kod ajax, jeśli jest on na zegarze i nie chcesz na niego czekać.

Spójrz na browser.evaluate(expr)

Innym rozwiązaniem byłoby po prostu użyć normalny czas oczekiwania JavaScript czekać 20 sekund, a następnie spojrzeć na DOM dla zmian spodziewasz.

setTimeout(function(){ 
    browser.document.query("#interestingElement") 
}, 20*1000); 
+0

Po prostu: byłoby naprawdę miłe, gdyby Zombie naprawdę czekał aż wszystkie skrypty na strona została załadowana, ale o ile widzę na http://stackoverflow.com/questions/37482891/php-mink-zombie-handling-hanging-processes-after-a- fatal-exception, to niekoniecznie musi być dla wszystkich stron niestety ... – sdbbs