Secondo la documentazione di CasperJS :
then()
Firma: then(Function then)
Questo metodo è il modo standard per aggiungere un nuovo passaggio di navigazione allo stack, fornendo una semplice funzione:
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();
Puoi aggiungere tutti i passaggi di cui hai bisogno. Tieni presente che l' Casper
istanza corrente associa automaticamente il filethis
parola chiave all'interno delle funzioni passo.
Per eseguire tutti i passaggi definiti, chiama il file run()
metodo e voilà.
Nota: è necessario start()
l'istanza casper per utilizzare l'estensionethen()
metodo.
Avvertimento: funzioni Step aggiunte then()
vengono elaborate in due diversi casi:
- quando è stata eseguita la funzione passo precedente,
- quando la precedente richiesta HTTP principale è stata eseguita e la pagina caricata ;
Nota che non esiste una definizione unica di pagina caricata ; è quando è stato attivato l'evento DOMReady? "Tutte le richieste sono state completate"? È "tutta la logica dell'applicazione in esecuzione"? O "tutti gli elementi vengono renderizzati"? La risposta dipende sempre dal contesto. Ecco perché sei incoraggiato a usare sempre il filewaitFor()
metodi familiari per mantenere un controllo esplicito su ciò che ti aspetti effettivamente.
Un trucco comune è usare waitForSelector()
:
casper.start('http://my.website.com/');
casper.waitForSelector('#plop', function() {
this.echo('I\'m sure #plop is available in the DOM');
});
casper.run();
Dietro le quinte, il codice sorgente diCasper.prototype.then
è mostrato di seguito:
/**
* 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;
};
Spiegazione:
In altre parole, then()
pianifica il passaggio successivo del processo di navigazione.
quando then()
viene chiamato, viene passata una funzione come parametro che deve essere chiamato come passo.
Controlla se un'istanza è stata avviata e, in caso contrario, visualizza il seguente errore:
CasperError: Casper is not started, can't execute `then()`.
Successivamente, controlla se l' page
oggetto è null
.
Se la condizione è vera, Casper crea un nuovo page
oggetto.
Successivamente, then()
convalida il filestep
parametro per verificare se non è una funzione.
Se il parametro non è una funzione, viene visualizzato il seguente errore:
CasperError: You can only define a step as a function
Quindi, la funzione controlla se Casper è in esecuzione.
Se Casper non è in esecuzione, then()
aggiunge il passaggio alla fine della coda.
Altrimenti, se Casper è in esecuzione, inserisce un sottopasso di un livello più profondo rispetto al passaggio precedente.
Infine, la then()
funzione si conclude emettendo un step.added
evento e restituisce l'oggetto Casper.
flow
di casperjs, ma ho scoperto che fondamentalmente non puoi fare riferimento a casper dall'interno di unaevaluate
chiamata. (cioè non puoi aprire un nuovo URL, log, eco, ecc.). Quindi, nel mio caso, Value veniva chiamato ma senza alcun modo di interagire con il mondo esterno.