【问题标题】:polling for RSS feed with casperjs not working使用 casperjs 轮询 RSS 提要不起作用
【发布时间】:2015-04-01 02:46:38
【问题描述】:

我正在尝试使用 casperjs waitFor() 匹配 RSS 提要中的令牌(字符串令牌),但它似乎不起作用。还有其他方法(不使用轮询)可以解决,但我需要进行轮询。这是代码sn-p:

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),网址是:https://secure.hyper-reach.com:488/rss/323708

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

【问题讨论】:

  • 我不明白令牌应该是什么。因此,您正在 CasperJS 中打开提要 xml。它只是一个文件,它会立即加载,那么您还在等什么?
  • 令牌在 guid 标签中。它是我们在每个帖子中生成的东西,它是唯一标识符。
  • 我正在等待提要 xml 的新帖子。基本上,它不是静态的。每次测试都会更新 xml 提要,并且需要一段时间来更新它。所以,我需要轮询更新,而令牌是我确保它被更新的方式。测试每小时运行一次
  • 现在摆脱评估。

标签: javascript casperjs


【解决方案1】:

evaluate() 是沙盒页面上下文。它里面的任何东西都不能访问外部定义的变量,this 指的是页面的window,而不是casper。这里不需要evaluate() 函数,因为您不访问页面上下文。


另一件事是casper.resourceExists() 处理资源元数据,例如 URL 和请求标头。您似乎想检查资源的内容。如果您使用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");
});

【讨论】:

  • resourceExists(token) 不起作用。它永远不会进入 if 条件。 casperjs.readthedocs.org/en/latest/modules/… 这清楚地表明将字符串传递给函数应该可以工作;知道我在这里缺少什么吗?
  • 或者我可以在这里使用的任何其他功能?
  • 我不知道,因为您还没有展示令牌可能是什么以及它应该匹配什么。在您的问题中添加一个带有标记的示例。
  • 我可以递归调用 then() 吗?
  • 是的,您可以嵌套所有步骤(then*wait* 函数)。
猜你喜欢
  • 2015-07-25
  • 2015-08-22
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多