我刚刚将CasperJS用于我的项目。它的语法清晰易学。但是,通过其文档,我从未发现有关条件语句的任何内容。例如,如果我们可以按以下方式使用CasperJS,那么它可能很有用:
var casper = require('casper').create();
var no_error = false;
casper.start('http://casperjs.org/', function() {
this.echo(this.getTitle());
no_error = true;
});
if (no_error) {
casper.thenOpen('http://phantomjs.org', function() {
this.echo(this.getTitle());
});
}
casper.run();
有没有什么方法可以自定义CasperJS?
答案 0 :(得分:7)
是的,否则像casper.exists
这样的同步功能是没有意义的。
在您的示例中,no_error
永远不会是true
,因为casper.start
回调是在长期评估if (no_error)
时异步执行的。
您必须嵌套一些步骤(所有wait*
和then*
函数都是步骤)才能执行此操作:
var casper = require('casper').create();
var no_error = false;
casper.start('http://casperjs.org/', function() {
this.echo(this.getTitle());
no_error = true;
});
casper.then(function(){
if (no_error) {
casper.thenOpen('http://phantomjs.org', function() {
this.echo(this.getTitle());
});
}
});
casper.run();
您可以嵌套步骤函数,但是您必须记住,在步骤之后不应该使用同步函数,因为它将以相反的方式执行。
casper.then(function(){
casper.thenOpen('http://phantomjs.org', function() {
this.echo("1: " + this.getTitle());
});
this.echo("2: " + this.getTitle());
});
将首先打印2然后打印1.
如果同步返回条件数据,则可以直接评估
casper.start('http://casperjs.org/', function() {
var array = this.evaluate(function(){....});
if (array && array.length > 2) {
this.thenOpen(...);
}
});
根本不需要额外的步骤。
这是有趣的地方。例如,如果您必须在页面上下文中触发长时间运行的脚本(它不限于页面上下文),则必须等待其在casper上下文中完成。您需要一个指标变量。
casper.thenEvaluate(function(){
longRunningFunction(function callback(){
window.__someIndicator = true;
});
});
casper.waitFor(function check(){
return this.evaluate(function(){
return !!window.__someIndicator;
});
}, function then(){
this.thenOpen(...);
}, function onTimeout(){
this.echo("failed");
this.thenOpen(...); // open something else
});
有时您没有可能的回调。在这种情况下,DOM可能会更改,您必须等待这些更改。
第一个代码段中的示例并不真正有用,应该与其他方法之一进行交换。