2015-02-09 4 views
12

Ich versuche sagen CasperJS erreichen folgendes zu machen:Wie CasperJS eine Schleife durch eine Reihe von Seiten

  • Gehen Sie durch eine Reihe von Seiten, die nacheinander nach dem Datum benannt sind.
  • Suchen Sie auf jeder Seite einen PDF-Link.
  • Laden Sie das PDF herunter.

Ich habe ein paar Arbeitscode, aber ich verstehe nicht, wie CasperJS die Reihenfolge der Ereignisse durchläuft.

Zum Beispiel in dem Codebeispiel unten, versucht CasperJS Schritt zu verarbeiten 2 und wirft einen „Reference: nicht Variable finden: formDate“, während Schritt 1 überhaupt nicht aus irgendeinem Grund durchgeführt.

Was ist los mit meiner Argumentation?

Es scheint mir, dass die while Schleife mit einer anderen Geschwindigkeit als die casper.then Methoden ausgeführt wird.

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(); 
}); 

Antwort

17

Nach einigen Recherchen fand ich eine Lösung für dieses Problem.

Das Problem, das von casper.thenOpen verursacht wird ein asynchrones Prozess zu sein, und der Rest der JavaScript wobei synchronen.

Ich habe an elegant method found in this thread (Asynchronous Process in einem Javascript for-Schleife) angewendet.

dieser Methode folgend, hier ist ein Beispiel, das mit CasperJS funktioniert:

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(); 
}); 

Dieses Beispiel gibt das folgende wird:

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

Die Schleife arbeitet! :)

+0

Wie würdest du ein "Fortfahren" in dieser Schleife machen? – ProGirlXOXO

Verwandte Themen