使用 casperjs 轮询 RSS 提要不起作用

polling for RSS feed with casperjs not working

我正在尝试使用 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 url 上没有得到任何点击(重新加载不工作)。理想情况下,如果页面没有看到令牌,我想刷新页面,然后再次检查令牌,它应该一直这样做,直到 waitFor 超时。

我也尝试过使用 assertTextExists() 而不是 resourceExists() 但即使这样也没有用。

我正在使用 PhantomJS (1.9.7) & url 是:https://secure.hyper-reach.com:488/rss/323708

我要找的令牌是 --> item/272935。如果您查看我上面提到的 url,您会在每个 guid 标记中找到它。我将 "item/" 也包含在我的令牌中的原因是它不会错误地匹配任何其他数字。

evaluate() 是沙盒页面上下文。它内部的任何内容都无法访问外部定义的变量,this 指的是页面的 window 而不是 casper。此处不需要 evaluate() 函数,因为您不访问页面上下文。


另一件事是 casper.resourceExists() 处理资源元数据,例如 URL 和请求 headers。看来您想检查资源的内容。如果您使用 casper.thenOpen()casper.open() 打开 RSS 提要,那么您可以使用 casper.getPageContent() 检查文本是否存在。


您的代码的实际问题是您以一种行不通的方式混合了同步和异步代码。 waitFor() 是这项工作的错误工具,因为您需要在其执行过程中重新加载,但检查函数的调用速度如此之快,以至于可能不会加载完整的页面来实际测试它。

您需要递归检查文档是否更改为您喜欢的。

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