我正在使用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
运行似乎正在运行。