等待Casper.js中的URL更改?

时间:2015-01-21 18:41:08

标签: javascript casperjs

waitForUrl()中有Casper.js个功能,但是waitForUrlChange()中的Casper.js是否有可能?

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

2 个答案:

答案 0 :(得分:8)

它有一个事件处理程序

casper.on('url.changed',function(url) {
casper.echo(url);
});

以下是它的文档:http://casperjs.readthedocs.org/en/latest/events-filters.html#url-changed

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

答案 1 :(得分:7)

不是内置的,但你可以写自己很容易:

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的mentioned,可以通过检查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;
    };
}