我是Java Script的新手,我需要帮助:) 我想调用函数(set_calendar_date()),然后获取页面innerHTML。
<a onclick="set_calendar_date('1'); return false;" href="#">
<span>
26/02 We
</span>
PhantomJs代码:
page.open(url, function (status) {
if (status !== 'success')
{
console.log('Unable to access network');
}
else
{
var events = page.evaluate(function () {
// here i want to call set_calendar_date();
return document.getElementById('fs').innerHTML;
});
var file= require('fs');
file.write('results.txt',events,'w+');
phantom.exit();
}});
答案 0 :(得分:1)
执行函数set_calendar_date
似乎会通过ajax加载内容或进行一些处理来生成内容。此内容将放置在某处,可能位于ID为fs
的元素内。
考虑到这个过程的异步性质,你不能在调用函数后直接返回innerHTML
(你可能要么得到旧数据,要么根本没有)。
我建议在评估
中调用该函数 page.evaluate(function () {
set_calendar_date('1');
});
接下来,您需要了解“更新”的性质。找到一个有助于以编程方式确定更新已完成或尚未完成的元素。比如说,如果标识为innherHTML
的元素的fs
为空,则内容尚未更新。
然后继续检查目标元素的变化(vis,fs
)。您可以使用window.setInterval
继续检查。
代码可以类似于:
page.evaluate(function () {
set_calendar_date('1');
});
var waiter = window.setInterval(function(){
var fsContent = page.evaluate(function(){
var elm = document.getElementById('fs');
return elm && elm.innerHTML || false;
});
// if content is found
if (fsContent !== false) {
window.clearInterval(waiter);
var file= require('fs');
file.write('results.txt',fsContent,'w+');
}
}, 300);
注意:这可以使用CasperJS(PhantomJS的包装器)使用更简单的代码实现。 CasperJS提供了许多功能,可以轻松完成,例如使用waitForSelectorTextChange()
或waitFor()
,waitForSelector()
或waitWhileSelector()
等。