使用casperjs无法正常轮询RSS源

时间:2015-03-28 22:49:12

标签: javascript casperjs

我正在尝试使用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 /"也作为我的令牌的一部分,以便它不会错误地匹配任何其他数字。

1 个答案:

答案 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");
});