等待 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;
};
}
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;
};
}