调用函数PhantomJs

时间:2014-02-25 13:21:37

标签: javascript phantomjs

我是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();
}});

1 个答案:

答案 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()等。