此代码扩展了dynamic.js脚本。 dynamic.js运行如下:start
,then
,run
,然后run
回调是动态loop
。运行正常。我的代码不希望在run
回调结束时循环,它想在中间循环,以便我可以在之后运行更多代码。所以它是start
,then
,loop
,then
,run
。似乎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();
答案 0 :(得分:2)
您应该只在脚本中使用casper.start
和casper.run
一次。但是,您可以使用它们。如果你遇到了&#34; undefined&#34;行为,如果您将它们嵌套在另一个控制流中。我发现最好使用casper.thenOpen
和casper.then
代替casper.start
和casper.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();
即可。你提前退出。但我仍强烈建议您重构脚本。