CasperJS中的条件语句

Conditional statements in CasperJS

本文关键字:语句 条件 CasperJS      更新时间:2023-09-26

我刚刚在我的项目中使用了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可能会发生更改,您必须等待这些更改。

结论

第一个片段中的示例并不是很有用,应该用其他方法进行交换。