Según la documentación de CasperJS :
then()
Firma: then(Function then)
Este método es la forma estándar de agregar un nuevo paso de navegación a la pila, proporcionando una función 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();
Puede agregar tantos pasos como necesite. Tenga en cuenta que la Casper
instancia actual enlaza automáticamente la this
palabra clave dentro de las funciones de paso.
Para ejecutar todos los pasos que definió, llame al run()
método y listo.
Nota: debe tener start()
la instancia de casper para poder utilizar el then()
método.
Advertencia: Las funciones de paso agregadas then()
se procesan en dos casos diferentes:
- cuando se ha ejecutado la función del paso anterior,
- cuando se ha ejecutado la solicitud HTTP principal anterior y se ha cargado la página ;
Tenga en cuenta que no existe una definición única de página cargada ; ¿Es cuando se ha activado el evento DOMReady? ¿Se trata de "finalizar todas las solicitudes"? ¿Se está ejecutando "toda la lógica de la aplicación"? ¿O "todos los elementos se están renderizando"? La respuesta siempre depende del contexto. Por lo tanto, se le anima a usar siempre los waitFor()
métodos familiares para mantener un control explícito sobre lo que realmente espera.
Un truco común es usar waitForSelector()
:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
Detrás de escena, el código fuente deCasper.prototype.then
se muestra a continuación:
/**
* 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;
};
Explicación:
En otras palabras, then()
programa el siguiente paso del proceso de navegación.
Cuando then()
se llama, se le pasa una función como parámetro que debe llamarse como paso.
Comprueba si se ha iniciado una instancia y, si no, muestra el siguiente error:
CasperError: Casper is not started, can't execute `then()`.
A continuación, comprueba si el page
objeto es null
.
Si la condición es verdadera, Casper crea un nuevo page
objeto.
Después de eso, then()
valida el step
parámetro para verificar si no es una función.
Si el parámetro no es una función, muestra el siguiente error:
CasperError: You can only define a step as a function
Luego, la función verifica si Casper se está ejecutando.
Si Casper no se está ejecutando, then()
agrega el paso al final de la cola.
De lo contrario, si Casper se está ejecutando, inserta un subpaso un nivel más profundo que el paso anterior.
Finalmente, la then()
función concluye emitiendo un step.added
evento y devuelve el objeto Casper.
flow
de casperjs, pero descubrí que básicamente no se puede hacer referencia a casper desde dentro de unaevaluate
llamada. (es decir, no puede abrir una nueva URL, registro, eco, etc.). Entonces, en mi caso, se llamaba a evaluar, pero no había forma de interactuar con el mundo exterior.