Comment dire à CasperJS de suivre une série de pages

J'essaie de faire en sorte que CasperJS réalise ce qui suit:

  • Parcourez une série de pages nommées séquentiellement par date.
  • Sur chaque page, recherchez un lien PDF.
  • Téléchargez le PDF.

J'ai un code de travail, mais je ne comprends pas comment CasperJS parcourt la séquence des événements.

Par exemple, dans l'exemple de code ci-dessous, CasperJS essaie de traiter l'étape 2 et lance un "ReferenceError: ne peut pas trouver la variable: formDate", alors que l'étape 1 n'est pas exécutée du tout pour une raison quelconque.

Quel est le problème avec mon raisonnement?

Il me semble que la boucle while est exécutée à une vitesse différente de casper.then méthodes casper.then .

 casper.start(); casper.thenOpen('http://www.example.com', function() { this.echo(this.getTitle()); }); casper.then(function() { var start = new Date('2013-01-01T00:00:00'); var end = new Date('2013-01-31T00:00:00'); while(start < end) { // step 1: define formDate casper.then(function() { var formDate = start.getFullYear()+"-"+("0" + (start.getMonth() + 1)).slice(-2) +"-"+("0" + start.getDate()).slice(-2) ; casper.echo(formDate); }); // Step 2: open the page and download the file casper.thenOpen('http://www.example.com/' + formDate, function() { var url = this.getElementAttribute('div#pdffulllink a.pdf', 'href'); this.echo(url); this.download(url, 'Downloaded_' + formDate + '.pdf'); }); casper.then(function() { // Step 3: redefine start var newDate = start.setDate(start.getDate() + 1); start = new Date(newDate); }); } }); casper.run(function() { this.echo('Done.').exit(); }); 

Après quelques recherches, j'ai trouvé une solution à ce problème.

Le problème est causé par casper.thenOpen étant un processus asynchrone , et le reste du javascript étant synchrone .

J'ai appliqué une méthode élégante trouvée dans ce thread (processus asynchrone dans un javascript pour la boucle).

Suivant cette méthode, voici un exemple qui fonctionne avec CasperJS:

 var casper = require('casper').create({ pageSettings: { webSecurityEnabled: false } }); casper.start(); casper.then(function() { var current = 1; var end = 4; for (;current < end;) { (function(cntr) { casper.thenOpen('http://example.com/page-' + cntr +'.html', function() { this.echo('casper.async: '+cntr); // here we can download stuff }); })(current); current++; } }); casper.run(function() { this.echo('Done.').exit(); }); 

Cet exemple produira les éléments suivants:

 casper.async: 1 casper.async: 2 casper.async: 3 Done. 

La boucle fonctionne! 🙂