Javascript 是否等待Casper.js中的URL更改?

Javascript 是否等待Casper.js中的URL更改?,javascript,casperjs,Javascript,Casperjs,Casper.js中有一个waitForUrl()功能,但是在Casper.js中是否可以waitForUrlChange() 我的意思是检测this.getCurrentUrl()值的变化。我无法预测新的url值。它可以是任何东西。它有一个事件处理程序 casper.on('url.changed',function(url) { casper.echo(url); }); 以下是它的文档: 然而,正如Artjom B.所提到的,这并不能涵盖函数扩展将处理的所有情况。只有当您不需要它作为控制

Casper.js
中有一个
waitForUrl()
功能,但是在
Casper.js
中是否可以
waitForUrlChange()


我的意思是检测
this.getCurrentUrl()
值的变化。我无法预测新的url值。它可以是任何东西。

它有一个事件处理程序

casper.on('url.changed',function(url) {
casper.echo(url);
});
以下是它的文档:


然而,正如Artjom B.所提到的,这并不能涵盖函数扩展将处理的所有情况。只有当您不需要它作为控制流的一部分时,它才是真正合适的,而只是想在它发生时反应性地刮取一些值。

不是内置的,但您可以非常简单地编写自己的:

casper.waitForUrlChange = function(then, onTimeout, timeout){
    var oldUrl;
    this.then(function(){
        oldUrl = this.getCurrentUrl();
    }).waitFor(function check(){
        return oldUrl === this.getCurrentUrl();
    }, then, onTimeout, timeout);
    return this;
};
这是一个合适的函数扩展,因为它与其他
wait*
函数具有相同的语义(参数是可选的,它等待),并且它支持构建器模式(有些人也称为promise模式)

正如Darren Cook所说,可以通过检查CasperJS中是否已经存在
waitForUrlChange
,并在CasperJS更改API时使用动态参数列表来进一步改进这一点:

if (!casper.waitForUrlChange) {
    casper.waitForUrlChange = function(){
        var oldUrl;
        // add the check function to the beginning of the arguments...
        Array.prototype.unshift.call(arguments, function check(){
            return oldUrl === this.getCurrentUrl();
        });
        this.then(function(){
            oldUrl = this.getCurrentUrl();
        });
        this.waitFor.apply(this, arguments);
        return this;
    };
}

这样做的问题是,您打破了控制流。你至少还需要等待事件发生。这是一个公平的批评。我会更新答案来突出这个问题。很好的方法。我想知道是否有一种方法可以使用
参数
将所有参数转发到
waitFor()
。然后,如果将第四个参数添加到
waitFor()
中,则此函数将成为未来的证明。如果(!casper.waitForUrlChange)函数被添加到核心CasperJS中,也可以在它前面加上
if(!casper.waitForUrlChange)
。@DarrenCook谢谢!我从中学到了一些东西。我不知道人们可以简单地利用
arguments
对象中的函数,因为它不是一个数组。现在可以证明未来,但需要更多的脑力(或大量的注释)来确定它在做什么:-)