Javascript casper.js中的setInterval和this.wait
我需要在每次迭代之间进行3次2秒的循环。我尝试了以下三种选择: 选项1Javascript casper.js中的setInterval和this.wait,javascript,webkit,qtwebkit,phantomjs,casperjs,Javascript,Webkit,Qtwebkit,Phantomjs,Casperjs,我需要在每次迭代之间进行3次2秒的循环。我尝试了以下三种选择: 选项1 var casper = require('casper').create({ verbose: false, logLevel: 'debug' }); casper.start("http://google.com"); casper.on('remote.message', function(msg) { this.echo('remote message caught: ' + msg);
var casper = require('casper').create({
verbose: false,
logLevel: 'debug'
});
casper.start("http://google.com");
casper.on('remote.message', function(msg) {
this.echo('remote message caught: ' + msg);
})
casper.thenEvaluate(function() {
var x = 0;
var intervalID = setInterval(function () {
console.log("Using setInternal " + x);
if (++x === 3) {
window.clearInterval(intervalID);
}
}, 2000);
});
casper.run();
观察:没有显示任何内容,因为脚本在调用第一个setInterval
之前立即结束
var count = 0;
var waitFunc = function() {
this.wait(2000, function() {
if (count < 3) {
casper.echo('Using this.wait ' + count);
count++;
waitFunc();
}
});
};
选项2
将下面的thenEvaluate()
替换为then()
for (i=0; i<3; i++) {
this.wait(2000);
this.echo('Using this.wait ' + i);
}
观察:屏幕上没有打印任何内容
因此,我的问题是:如何使this.wait或setInterval像这种情况一样在3次循环中工作?以下是解决问题的示例实现:
var casper = require('casper').create();
var last, list = [0, 1, 2, 3];
casper.start("http://google.fr/", function() {
this.echo('google');
});
casper.on('remote.message', function(msg) {
this.echo('remote message caught: ' + msg);
});
casper.thenEvaluate(function() {
window.x = 0;
var intervalID = setInterval(function() {
console.log("Using setInternal " + window.x);
if (++window.x === 3) {
window.clearInterval(intervalID);
}
}, 500);
});
casper.each(list, function(self, i) {
self.wait(500, function() {
last = i;
this.echo('Using this.wait ' + i);
});
});
casper.waitFor(function() {
return last === list[list.length - 1] && 3 === this.getGlobal('x');
}, function() {
this.echo('All done.').exit();
});
casper.run(function() {});
样本输出:
$ casperjs test.js
google
remote message caught: Using setInternal 0
Using this.wait 0
remote message caught: Using setInternal 1
Using this.wait 1
remote message caught: Using setInternal 2
Using this.wait 2
Using this.wait 3
All done.
$
我尝试了所有3个选项,但没有一个workedIt起作用。但是你能解释一下casper.each和for循环的用法吗?为什么self.wait()在这种情况下有效。使用for循环将执行所有这些。echo()然后执行漫长的等待。这是因为javascript的作用域是如何工作的。标准的
for
循环将始终具有最新的i
值集,这就是为什么您通常必须使用(Casper.each
将循环包装在IIFE中)。啊,根据链接,这也起作用:Casper.then(function(){for(i=0;iYeah当然,正如我所说的Casper.each()
只在内部使用IIFE:)