我有一个页面通过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();
这会抓取来源,但不会获得相同的来源,而不是点击“下一步”按钮的更新标记。
答案 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。