Подтвердить что ты не робот

Как рассказать CasperJS о чередовании страниц

Я пытаюсь сделать CasperJS следующим:

  • Пройдите через ряд страниц, которые последовательно обозначаются по дате.
  • На каждой странице найдите ссылку в формате PDF.
  • Загрузите PDF.

У меня есть рабочий код, но я не понимаю, как CasperJS проходит последовательность событий.

Например, в примере кода ниже CasperJS пытается обработать шаг 2 и выбрасывает "ReferenceError: Can not find variable: formDate", в то время как шаг 1 по какой-то причине не выполняется.

Что не так с моими рассуждениями?

Мне кажется, что цикл while выполняется с другой скоростью, чем методы 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();
});
4b9b3361

Ответ 1

После некоторых исследований я нашел решение этой проблемы.

Проблема вызвана тем, что casper.thenOpen является асинхронным процессом, а остальная часть javascript является синхронной.

Я применил элегантный метод, найденный в этом потоке (асинхронный процесс внутри цикла javascript for).

Следуя этому методу, вот пример, который работает с 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();
});

В этом примере выводится следующее:

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

Цикл работает!:)