casperjs:如何使用ajax更新捕获循环页面

时间:2013-09-30 05:09:08

标签: javascript phantomjs casperjs

我有一个页面通过ajax(因此没有页面加载)通过“下一步”按钮进行更新。我想点击“下一步”按钮(onclick js函数),每次抓取页面源并重复N次。

var casper = require('casper').create();
var limit = 10, count = 0;

casper.start('http://example.com');

casper.then(function() {

casper.repeat(limit, function() {

    this.echo(this.getHTML());
    this.echo('-------------------------');
    this.click('.next-btn');
    wait(2000);
    count++;

});

});

casper.run();

这会抓取来源,但不会获得相同的来源,而不是点击“下一步”按钮的更新标记。

2 个答案:

答案 0 :(得分:1)

如果我没错,你就会误用wait(2000)。等待不会停止执行。下一行count++和循环继续。

简而言之,wait是异步的,如果你需要实际等待一段时间然后执行一段代码,请使用wait callback函数,如文档中所示:

casper.start('http://yoursite.tld/');

casper.wait(1000, function() {
    this.echo("I've waited for a second.");
});

casper.run();

如果您已完成以下代码,则无法获得所需的结果:

casper.start('http://yoursite.tld/');

casper.wait(1000);
this.echo("I've waited for a second.");

casper.run();    

因此,您需要链接它:让我尝试修改您的代码:

var casper = require('casper').create();
var limit = 10, count = 0, waitms = 2000;

casper.start('http://example.com');

casper.then(function() {
    // Raise a custom event (for the first load)
    casper.emit("ajax.content.loaded");

    // Event listener for a custom event
    casper.on("ajax.content.loaded", function () {

        // Increase counter
        count++;
        // Break loop when limit is reached
        if(c > limit) {
            casper.exit();
        }

        this.echo(this.getHTML());
        this.echo('-------------------------');
        this.click('.next-btn');

        casper.wait(waitms, function () {
            // Recursively raise the custom event after waiting a bit
            casper.emit("ajax.content.loaded");
        });

    });

});

casper.run();

希望这会有所帮助。

答案 1 :(得分:0)

如果没有提供该页面,我无法对其进行测试,但我认为您的问题是CasperJS完全与Google Chrome相同 - 它只是返回最初从服务器提供的来源。

以此网站为例:http://angular.github.io/angular-phonecat/step-11/app/#/phones

这是Google针对AngularJS的教程。当您查看源时,它包含的是:

<body>
  <div ng-view></div>
</body>

但是在JavaScript控制台中,运行

document.body.innerHTML;

返回当时页面上生成的HTML。

对于CasperJS,您可能希望查看evaluate()并运行上述JavaScript以获取更新的HTML。