5

各反復の間に 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

以下thenEvaluate()に差し替えthen()

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 回のループで動作させるにはどうすればよいですか?

4

1 に答える 1

14

問題を解決するためのサンプル実装は次のとおりです。

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.
$
于 2012-11-26T09:58:02.923 に答える