javascript – 如何告诉CasperJS循环浏览一系列页面

前端之家收集整理的这篇文章主要介绍了javascript – 如何告诉CasperJS循环浏览一系列页面前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图让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

猜你在找的JavaScript相关文章