Selon la documentation CasperJS :
then()
Signature: then(Function then)
Cette méthode est le moyen standard d'ajouter une nouvelle étape de navigation à la pile, en fournissant une fonction simple:
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();
Vous pouvez ajouter autant d'étapes que nécessaire. Notez que l' Casper
instance actuelle lie automatiquement le this
mot - clé pour vous dans les fonctions d'étape.
Pour exécuter toutes les étapes que vous avez définies, appelez la run()
méthode et le tour est joué.
Remarque: vous devez start()
l'instance casper pour utiliser la then()
méthode.
Attention: les fonctions Step ajoutées à then()
sont traitées dans deux cas différents:
- lorsque la fonction de l'étape précédente a été exécutée,
- lorsque la requête HTTP principale précédente a été exécutée et la page chargée ;
Notez qu'il n'y a pas de définition unique de la page chargée ; est-ce lorsque l'événement DOMReady a été déclenché? Est-ce que "toutes les demandes sont terminées"? Est-ce que "toute la logique d'application est exécutée"? Ou "tous les éléments étant rendus"? La réponse dépend toujours du contexte. C'est pourquoi vous êtes encouragé à toujours utiliser les waitFor()
méthodes familiales pour garder un contrôle explicite sur ce que vous attendez réellement.
Une astuce courante consiste à utiliser waitForSelector()
:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
Dans les coulisses, le code source deCasper.prototype.then
est indiqué ci-dessous:
/**
* 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;
};
Explication:
En d'autres termes, then()
planifie l'étape suivante du processus de navigation.
Lorsqu'elle then()
est appelée, une fonction lui est transmise en tant que paramètre qui doit être appelée en tant qu'étape.
Il vérifie si une instance a démarré, et si ce n'est pas le cas, il affiche l'erreur suivante:
CasperError: Casper is not started, can't execute `then()`.
Ensuite, il vérifie si l' page
objet est null
.
Si la condition est vraie, Casper crée un nouvel page
objet.
Après cela, then()
valide le step
paramètre pour vérifier s'il ne s'agit pas d'une fonction.
Si le paramètre n'est pas une fonction, il affiche l'erreur suivante:
CasperError: You can only define a step as a function
Ensuite, la fonction vérifie si Casper est en cours d'exécution.
Si Casper n'est pas en cours d'exécution, then()
ajoute l'étape à la fin de la file d'attente.
Sinon, si Casper est en cours d'exécution, il insère une sous-étape d'un niveau plus profond que l'étape précédente.
Enfin, la then()
fonction se termine en émettant un step.added
événement et renvoie l'objet Casper.
flow
de casperjs, mais j'ai découvert que vous ne pouvez pas faire référence à casper à partir d'unevaluate
appel. (c'est-à-dire que vous ne pouvez pas ouvrir une nouvelle URL, un nouveau journal, un écho, etc.). Donc, dans mon cas, evalu a été appelé mais sans moyen d'interagir avec le monde extérieur.