等待 Casper.js 中的 URL 变化?

Wait for URL change in Casper.js?

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

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

它有一个事件处理程序

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

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

但是,正如 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* 函数具有相同的语义(参数是可选的并且它会等待)并且它支持构建器模式(某些人也称为承诺模式)。

正如 Darren Cook 的 ,可以通过检查 waitForUrlChange 是否已经存在于 CasperJS 中并在 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;
    };
}