我试图让CasperJS达到以下目的:
>浏览按日期顺序命名的一系列页面.
>在每个页面上,找到一个PDF链接.
>下载PDF.
我有一些工作代码,但我不明白CasperJS如何处理事件的顺序.
例如,在下面的代码示例中,CasperJS尝试处理步骤2,并抛出“ReferenceError:无法找到变量: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(); });
解决方法
经过一番研究,我找到了解决这个问题的办法.
问题是由casper.then打开是一个异步进程,其余的javascript是同步的.
我应用了an elegant method found in this thread(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.
循环正在工作! 原文链接:https://www.f2er.com/js/155259.html