1

我有一个通过“下一步”按钮通过 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();

这会捕获源,但会不断获取相同的源,而不是单击“下一步”按钮后更新的标记。

4

2 回答 2

1

如果我没记错的话,你有一个误用的wait(2000). 等待不会停止执行。下一行count++,循环继续。

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

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();

希望这可以帮助。

于 2013-10-01T11:48:56.770 回答
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。

于 2013-09-30T13:38:05.150 回答