Gemäß der CasperJS-Dokumentation :
then()
Unterschrift: then(Function then)
Diese Methode ist die Standardmethode, um dem Stapel einen neuen Navigationsschritt hinzuzufügen, indem eine einfache Funktion bereitgestellt wird:
casper.start('http://google.fr/');
casper.then(function() {
this.echo('I\'m in your google.');
});
casper.then(function() {
this.echo('Now, let me write something');
});
casper.then(function() {
this.echo('Oh well.');
});
casper.run();
Sie können beliebig viele Schritte hinzufügen. Beachten Sie, dass die aktuelle Casper
Instanz das this
Schlüsselwort automatisch innerhalb von Schrittfunktionen für Sie bindet .
Rufen Sie die run()
Methode und voila auf, um alle von Ihnen definierten Schritte auszuführen.
Hinweis: Sie müssen start()
die Casper-Instanz verwenden, um die then()
Methode verwenden zu können.
Warnung: Die hinzugefügten then()
Schrittfunktionen werden in zwei verschiedenen Fällen verarbeitet:
- wenn die vorherige Schrittfunktion ausgeführt wurde,
- wenn die vorherige HTTP-Hauptanforderung ausgeführt und die Seite geladen wurde ;
Beachten Sie, dass keine einzelne Definition der geladenen Seite vorhanden ist . Ist es, wenn das DOMReady-Ereignis ausgelöst wurde? Ist es "alle Anfragen werden erledigt"? Ist es "alle Anwendungslogik wird ausgeführt"? Oder "alle Elemente werden gerendert"? Die Antwort hängt immer vom Kontext ab. Aus diesem Grund sollten Sie immer die waitFor()
Familienmethoden verwenden, um die explizite Kontrolle darüber zu behalten, was Sie tatsächlich erwarten.
Ein üblicher Trick ist waitForSelector()
:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
Hinter den Kulissen wird der Quellcode fürCasper.prototype.then
unten gezeigt:
/**
* Schedules the next step in the navigation process.
*
* @param function step A function to be called as a step
* @return Casper
*/
Casper.prototype.then = function then(step) {
"use strict";
this.checkStarted();
if (!utils.isFunction(step)) {
throw new CasperError("You can only define a step as a function");
}
// check if casper is running
if (this.checker === null) {
// append step to the end of the queue
step.level = 0;
this.steps.push(step);
} else {
// insert substep a level deeper
try {
step.level = this.steps[this.step - 1].level + 1;
} catch (e) {
step.level = 0;
}
var insertIndex = this.step;
while (this.steps[insertIndex] && step.level === this.steps[insertIndex].level) {
insertIndex++;
}
this.steps.splice(insertIndex, 0, step);
}
this.emit('step.added', step);
return this;
};
Erläuterung:
Mit anderen Worten, then()
plant den nächsten Schritt im Navigationsprozess.
Beim then()
Aufruf wird eine Funktion als Parameter übergeben, die als Schritt aufgerufen werden soll.
Es wird überprüft, ob eine Instanz gestartet wurde, und wenn dies nicht der Fall ist, wird der folgende Fehler angezeigt:
CasperError: Casper is not started, can't execute `then()`.
Als nächstes wird geprüft, ob das page
Objekt ist null
.
Wenn die Bedingung erfüllt ist, erstellt Casper ein neues page
Objekt.
Danach wird then()
überprüft die step
Parameter zu überprüfen , ob es nicht eine Funktion ist.
Wenn der Parameter keine Funktion ist, wird der folgende Fehler angezeigt:
CasperError: You can only define a step as a function
Anschließend prüft die Funktion, ob Casper ausgeführt wird.
Wenn Casper nicht ausgeführt wird, then()
wird der Schritt an das Ende der Warteschlange angehängt.
Andernfalls fügt Casper, wenn es ausgeführt wird, einen Teilschritt ein, der eine Ebene tiefer als der vorherige Schritt ist.
Schließlich gibt die then()
Funktion ein step.added
Ereignis aus und gibt das Casper-Objekt zurück.
flow
von casperjs, aber ich habe festgestellt, dass Sie casper im Grunde nicht innerhalb einesevaluate
Anrufs referenzieren können . (dh Sie können keine neue URL, kein neues Protokoll, kein neues Echo usw. öffnen). In meinem Fall wurde also evalu aufgerufen, aber es gab keine Möglichkeit, mit der Außenwelt zu interagieren.