我刚刚在项目中使用了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以使其工作?
是的,否则这样的同步功能可能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可能会更改,您必须等待这些更改。
第一个代码段中的示例并没有真正有用,应将其替换为其他方法之一。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句