【发布时间】:2015-01-27 18:23:39
【问题描述】:
Casper.js 中有一个waitForUrl() 功能,但是Casper.js 中是否可以使用waitForUrlChange()?
我的意思是检测this.getCurrentUrl() 值的变化。我无法预测新的 url 值。它可以是任何东西。
【问题讨论】:
标签: javascript casperjs
Casper.js 中有一个waitForUrl() 功能,但是Casper.js 中是否可以使用waitForUrlChange()?
我的意思是检测this.getCurrentUrl() 值的变化。我无法预测新的 url 值。它可以是任何东西。
【问题讨论】:
标签: javascript casperjs
它有一个事件处理程序
casper.on('url.changed',function(url) {
casper.echo(url);
});
这是它的文档:http://casperjs.readthedocs.org/en/latest/events-filters.html#url-changed
但是,正如 Artjom B. 所提到的,这不会涵盖功能扩展将处理的所有情况。仅当您不需要将其作为控制流的一部分时才真正合适,而只是想在它发生时被动地抓取一些值。
【讨论】:
waitFor 来等待事件发生。
不是内置的,但你可以很容易地编写自己的:
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 中?
arguments 对象中,因为它不是数组。