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' Casperinstance actuelle lie automatiquement le thismot - 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' pageobjet est null.
Si la condition est vraie, Casper crée un nouvel pageobjet.
Après cela, then()valide le stepparamè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.
flowde casperjs, mais j'ai découvert que vous ne pouvez pas faire référence à casper à partir d'unevaluateappel. (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.