Как рассказать 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();
});
Ответы
Ответ 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.
Цикл работает!:)