2012-08-24 5 views
15

Ich habe eine Webanwendung, die kontinuierlich Daten vom Server mit Ajax-Anfragen abfragt. Ich würde gerne einen Integrationstest dafür unter zombie.js implementieren.Wie benutze ich browser.wait() in zombie.js?

Ich versuche zu warten, bis die Ajax-Poll-Schleife Daten vom Server empfängt. Die Daten sollten nach 20 Sekunden empfangen werden, also verwende ich browser.wait(done, callback), um zu prüfen, ob die Daten da sind, und setze waitFor auf ein maximales Zeitlimit von einer Minute.

browser.wait() jedoch kehrt fast immer sofort zurück, auch wenn mein done Callback false zurückgibt.

Im zombie API documentation las ich folgende über browser.wait():

... es nicht ewig warten kann, schon gar nicht für Timer, die wiederholt (zum Beispiel der Überprüfung Seite Zustand, langer Polling) abfeuern können.

Ich denke, das ist der Grund für das Verhalten, das ich sehe, aber ich verstehe nicht wirklich, was vor sich geht. Warum kann ich nicht eine Minute warten, bis meine Poll-Schleife Daten vom Server empfängt? Warum kann nicht browser.wait() auf Timer warten, die wiederholt ausgelöst werden können? Was muss ich tun, um meinen Test zu implementieren?

+0

Haben Sie etwas Neues darüber entdeckt? –

+0

Nur um sicher zu gehen: Sie verwenden Millisekunden für 'waitFor', richtig? Ich spreche von Erfahrung;) Vergessen Sie auch nicht 'maxWait'. – robertklep

+0

"fragt ständig nach Daten vom Server" - wenn Sie die Kontrolle darüber haben, wäre "socket.io" eine ausgezeichnete Alternative – jcollum

Antwort

2

Zombie.js wird standardmäßig warten, bis alle Skripte auf Ihrer Seite geladen und ausgeführt wurden, wenn sie auf Dokument bereit warten.

Wenn ich Sie richtig verstehe, wird Ihr Skript nicht ausgeführt, bis nach 20 Sekunden Dokument bereit. In diesem Fall hat Zombie eine Funktion, mit der Sie Javascript im Kontext des Browsers auswerten können, so dass Sie Ihren Ajax-Code schneller starten können, wenn es sich um einen Timer handelt und Sie nicht darauf warten wollen.

Blick auf browser.evaluate(expr)

Eine andere Möglichkeit wäre, einfach ein normales JavaScript-Timeout zu verwenden, um 20 Sekunden zu warten, und dann an dem DOM sucht die Änderungen, die Sie erwarten.

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

Nur ein Hinweis: es wäre wirklich nett gewesen, wenn Zombie wirklich bis alle Skripte auf dem gewartet hätte Seite geladen haben, aber soweit ich auf http://stackoverflow.com/questions/37482891/php-mink-zombie-handling-hanging-processes-after-a-fatal-exception sehen kann, ist das nicht unbedingt der Fall für alle Webseiten leider ... – sdbbs