Zgodnie z dokumentacją CasperJS :
then()
Podpis: then(Function then)
Ta metoda jest standardowym sposobem dodawania nowego kroku nawigacji do stosu, zapewniając prostą funkcję:
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();
Możesz dodać tyle kroków, ile potrzebujesz. Zwróć uwagę, że bieżąca Casperinstancja automatycznie wiąże thissłowo kluczowe w funkcjach krokowych.
Aby uruchomić wszystkie zdefiniowane kroki, wywołaj run()metodę i voila.
Uwaga:start() aby użyć tej then()metody, musisz mieć instancję casper .
Ostrzeżenie: dodane funkcje kroków then()są przetwarzane w dwóch różnych przypadkach:
- kiedy funkcja poprzedniego kroku została wykonana,
- kiedy poprzednie główne żądanie HTTP zostało wykonane i strona załadowana ;
Zauważ, że nie ma jednej definicji załadowanej strony ; czy to kiedy zdarzenie DOMReady zostało wywołane? Czy chodzi o „zakończenie wszystkich żądań”? Czy jest to „wykonywana jest cała logika aplikacji”? A może „renderowane są wszystkie elementy”? Odpowiedź zawsze zależy od kontekstu. Dlatego zachęcamy do korzystania z waitFor()rodzinnych metod, aby zachować wyraźną kontrolę nad tym, czego faktycznie oczekujesz.
Typową sztuczką jest użycie waitForSelector():
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
Za kulisami poniżej przedstawiono kod źródłowyCasper.prototype.then :
/**
* 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;
};
Wyjaśnienie:
Innymi słowy, then()planuje następny krok w procesie nawigacji.
Gdy then()jest wywoływana, przekazywana jest funkcja jako parametr, który ma zostać wywołany jako krok.
Sprawdza, czy wystąpienie zostało uruchomione, a jeśli tak się nie stało, wyświetla następujący błąd:
CasperError: Casper is not started, can't execute `then()`.
Następnie sprawdza, czy pageobiekt jest null.
Jeśli warunek jest spełniony, Casper tworzy nowy pageobiekt.
Następnie then()sprawdza poprawność stepparametru, aby sprawdzić, czy nie jest to funkcja.
Jeśli parametr nie jest funkcją, wyświetla następujący błąd:
CasperError: You can only define a step as a function
Następnie funkcja sprawdza, czy Casper działa.
Jeśli Casper nie jest uruchomiony, then()dołącza krok na koniec kolejki.
W przeciwnym razie, jeśli Casper działa, wstawia podetap o poziom głębszy niż w poprzednim kroku.
Na koniec then()funkcja kończy się wyemitowaniem step.addedzdarzenia i zwraca obiekt Casper.
flowzasad casperjs, ale odkryłem, że w zasadzie nie możesz odwoływać się do caspera z poziomuevaluatepołączenia. (tzn. nie możesz otworzyć nowego adresu URL, dziennika, echa itp.). Tak więc w moim przypadku wywołano ocenę, ale bez możliwości interakcji ze światem zewnętrznym.