[英]setInterval and this.wait in casper.js
我需要在每次迭代之間進行3次和2次循環 。 我試過這3個選項:
選項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);
})
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
之前立即結束。
選項2
用then()
替換thenEvaluate()
for (i=0; i<3; i++) {
this.wait(2000);
this.echo('Using this.wait ' + i);
}
觀察 :它立即輸出3次然后等待很長時間,因為this.wait()
是異步的。 這不是我想要的,因為我想在兩者之間延遲。
選項3用下面的方法替換then()
中的部件。 我在想這樣做的遞歸調用waitFunc()
每個之后wait()
被調用。
var count = 0;
var waitFunc = function() {
this.wait(2000, function() {
if (count < 3) {
casper.echo('Using this.wait ' + count);
count++;
waitFunc();
}
});
};
觀察 :屏幕上沒有打印出來。
所以我的問題是: 如何使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.
$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.