【问题标题】:Wait for URL change in Casper.js?等待 Casper.js 中的 URL 更改?
【发布时间】:2015-01-27 18:23:39
【问题描述】:

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

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

【问题讨论】:

    标签: javascript casperjs


    【解决方案1】:

    它有一个事件处理程序

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

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

    但是,正如 Artjom B. 所提到的,这不会涵盖功能扩展将处理的所有情况。仅当您不需要将其作为控制流的一部分时才真正合适,而只是想在它发生时被动地抓取一些值。

    【讨论】:

    • 这样做的问题是你脱离了控制流。您仍然需要至少一个 waitFor 来等待事件发生。
    • 这是一个中肯的批评。我会更新答案以突出问题。
    【解决方案2】:

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

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

    【讨论】:

    • 很棒的方法。我想知道是否有办法使用Arguments 将所有参数转发到waitFor()。然后,如果将第 4 个参数添加到 waitFor(),此函数将是面向未来的。也可以在它前面加上if(!casper.waitForUrlChange),以防该函数被添加到核心 CasperJS 中?
    • @DarrenCook 谢谢!我学到了一些东西。我不知道可以简单地将函数搭载在 arguments 对象中,因为它不是数组。
    • 现在面向未来,但需要更多脑力(或大量 cmets)才能弄清楚它在做什么 :-)
    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 2021-02-27
    • 2022-07-15
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多