动态CasperJS循环在随机迭代中终止

时间:2014-10-31 12:01:33

标签: javascript casperjs

此代码扩展了dynamic.js脚本。 dynamic.js运行如下:startthenrun,然后run回调是动态loop。运行正常。我的代码不希望在run回调结束时循环,它想在中间循环,以便我可以在之后运行更多代码。所以它是startthenloopthenrun。似乎casper在退出之前不等待我的loop完成。每次循环时,循环终止于不同的点,我从未看到"after dynamic loop"回显。这是一些示例输出(通常在2到8个循环之间结束),然后是代码:

输出:

start main
start dynamic loop
0
Something.
1
Something.
2
Something.
3
Something.
4
Something.
5
Something.

代码:

var casper = require('casper').create();

var limit = 10;
var i = 0;

// dynamic loop
var loop = function () {
    if (i < limit) {
        this.echo(i);
        this.start("http://www.something.com", function() {
            this.echo(this.evaluate(function () { return document.body.innerText; }));
        });
        i++;
        this.run(loop);
    } else {
        this.echo("dynamic loop done");
        this.exit();
    }
}

// main flow
casper.start('http://www.something.com', function() {
    this.echo("start main");
});

casper.then(function () {
    casper.start().then(function() {
        this.echo("start dynamic loop");
    });
    casper.run(loop);
});

casper.then(function () {
    this.echo("after dynamic loop");
})

casper.run();

1 个答案:

答案 0 :(得分:2)

您应该只在脚本中使用casper.startcasper.run一次。但是,您可以使用它们。如果你遇到了&#34; undefined&#34;行为,如果您将它们嵌套在另一个控制流中。我发现最好使用casper.thenOpencasper.then代替casper.startcasper.run

// dynamic loop
var loop = function () {
    if (i < limit) {
        this.echo(i);
        i++;
        this.thenOpen("http://www.something.com", function() {
            this.echo(this.evaluate(function () { return document.body.innerText; }));
        });
        this.then(loop);
    } else {
        this.echo("dynamic loop done");
    }
}

// main flow
casper.start('http://www.something.com', function() {
    this.echo("start main");
});

casper.then(loop);

casper.then(function () {
    this.echo("after dynamic loop");
})

casper.run();

您可能在一个脚本中有多个casper个实例,但是您需要以某种方式同步它们。

您的脚本可能需要一些修复而无需重构。只需从循环中删除this.exit();即可。你提前退出。但我仍强烈建议您重构脚本。