我正在尝试使用casperjs waitFor()匹配RSS提要中的标记(字符串标记),但它似乎不起作用。还有其他方法(不使用轮询)到处走走,但我需要轮询它。以下是代码段:
casper.then(function() {
this.waitFor(function matchToken() {
return this.evaluate(function() {
if(!this.resourceExists(token)) {
this.reload();
return false;
}
return true;
});
});
});
对rss url的更新不是动态的,因此需要刷新以检查令牌。但似乎(从访问日志)我没有在rss网址上获得任何点击(重新加载不工作)。理想情况下,我想刷新页面,如果它没有看到令牌,然后再次检查令牌&它应该继续这样做,直到waitFor超时。
我也尝试过使用assertTextExists()而不是resourceExists(),但即使这样也行不通。
我正在使用PhantomJS(1.9.7)&网址为:https://secure.hyper-reach.com:488/rss/323708
我正在寻找的令牌是 - >的项/ 272935 即可。如果你看一下我上面提到的网址,你会在每个guid标签中找到它。我之所以包括" item /"也作为我的令牌的一部分,以便它不会错误地匹配任何其他数字。
答案 0 :(得分:1)
evaluate()
是沙盒页面上下文。其中的任何内容都无法访问外部定义的变量,this
引用页面的window
而不是casper
。这里不需要evaluate()
函数,因为您不访问页面上下文。
另一件事是casper.resourceExists()
适用于资源元数据,例如URL和请求标头。您似乎想要检查资源的内容。如果您使用casper.thenOpen()
或casper.open()
打开RSS Feed,则可以使用casper.getPageContent()
查看文本是否存在。
您的代码的实际问题是您以不起作用的方式混合同步和异步代码。 waitFor()
是错误的工具,因为你需要在执行过程中重新加载,但是调用check函数的速度很快,以至于可能没有完整的页面加载来实际测试它。 / p>
您需要递归检查文档是否根据您的喜好进行更改。
var tokenTrials = 0,
tokenFound = false;
function matchToken(){
if (this.getPageContent().indexOf(token) === -1) {
// token was not found
tokenTrials++;
if (tokenTrials < 50) {
this.reload().wait(1000).then(matchToken);
}
} else {
tokenFound = true;
}
}
casper.then(matchToken).then(function(){
test.assertTrue(tokenFound, "Token was found after " + tokenTrials + " trials");
});