Sunday, June 2, 2024
 Popular · Latest · Hot · Upcoming
45
rated 0 times [  49] [ 4]  / answers: 1 / hits: 18559  / 12 Years ago, sun, november 25, 2012, 12:00:00

I need to make a loop of 3 times and 2 seconds in between each iteration. I tried these 3 options:



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


Observation: Nothing appeared because the script ended right away before the first setInterval being called.



Option 2



Replaced thenEvaluate() with then() below



for (i=0; i<3; i++) {
this.wait(2000);
this.echo('Using this.wait ' + i);
}


Observation: It outputs 3 times right away and then a long wait since this.wait() is async. This is not what I want because I want a delay in between.



Option 3
Replace the part in then() with this below. I was thinking about doing a recursive call to waitFunc() after each wait() being called.



var count = 0;
var waitFunc = function() {
this.wait(2000, function() {
if (count < 3) {
casper.echo('Using this.wait ' + count);
count++;
waitFunc();
}
});

};


Observation: Nothing printed out on the screen.



So my question is: How to make this.wait or setInterval works in a loop of 3 times like this case?


More From » webkit

 Answers
20

Here's a sample implementation to solve your problem:



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


Sample output:



$ 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.
$

[#81814] Friday, November 23, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
grayson

Total Points: 36
Total Questions: 113
Total Answers: 95

Location: Tonga
Member since Fri, Aug 21, 2020
4 Years ago
;