PhantomJS没有评估新内容

时间:2016-02-19 07:24:16

标签: javascript phantomjs ecmascript-6

我正在使用phantom包编写一个脚本来检索网页上的shoutbox内容,该网页每隔一秒左右使用AJAX请求刷新一次。我打开页面,注入jQuery,并使用jQuery来评估(使用page.evaluate)来获取该shoutbox的内容并将消息返回到幻像实例。目前,我的脚本只能打印前30个左右的消息然后它找不到任何新消息,即使它确实存在。

tl; dr:jQuery代码不断返回相同的消息,即使页面上出现了新的消息。

这里是精简代码(没有错误检查或记录消息):

'use strict';
let phantom = require('phantom');

function isShoutboxVisible() {
  return $('#shoutbox_frame').is(':visible');
}

function listenForShoutbox(page) {
  setInterval(() => {
    page.evaluate(function() {
      // Return the shoutbox responses and slice off the notice.
      var $shouts = $('#shoutbox_frame .smallfont').slice(1);
      var buffer = [];
      $shouts.each(function() {
        buffer.push($(this).context.innerText.trim());
      });
      return buffer;
    }).then((buffer) => {
      // Print shoutbox messages...
      // `buffer` doesn't seem to change after first evaluation.
    });
  }, 1000);
}

phantom.create().then((ph) => {
  // See: https://github.com/ariya/phantomjs/blob/master/examples/waitfor.js
  function waitFor(testFx, onReady, timeOutMillis) {
    let maxtimeOutMillis = timeOutMillis ? timeOutMillis : 1000;
    let start = new Date().getTime();
    let condition = false;
    let interval = setInterval(() => {
      if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
        condition = testFx();
      } else {
        if (!condition) {
          ph.exit(3);
        } else {
          onReady();
          clearInterval(interval);
        }
      }
    }, 250);
  }

  ph.createPage().then((page) => {
    let res = new Promise((resolve, reject) => {
      page.open(SITE_URL).then((status) => {
        status === 'success' ? resolve() : reject();
      });
    });
    res.then(() => {
      page.includeJs(JQUERY_URL).then(() => {
        // Wait for the DOM to render the shoutbox.
        waitFor(
          () => page.evaluate(isShoutboxVisible),
          () => {
            listenForShoutbox(page);
          }
        );
      });
    });
  });
});

我不明白为什么这不起作用。根据我的理解,PhantomJS执行AJAX调用,因此应该定期更新shoutbox。我做异步工作的方式有问题吗?也许我每次都需要重新加载页面?

感谢您的帮助。

编辑:将脚本从ES6重写为ES5然后直接从phantomjs运行似乎正在运行。

0 个答案:

没有答案