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 Casper
instancja automatycznie wiąże this
sł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 page
obiekt jest null
.
Jeśli warunek jest spełniony, Casper tworzy nowy page
obiekt.
Następnie then()
sprawdza poprawność step
parametru, 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.added
zdarzenia i zwraca obiekt Casper.
flow
zasad casperjs, ale odkryłem, że w zasadzie nie możesz odwoływać się do caspera z poziomuevaluate
połą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.