PhantomJS includeJs()+ Nested evaluate()Not Working

时间:2017-01-19 01:40:52

标签: javascript jquery phantomjs

考虑以下代码......

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'Lisas headless browser';
page.open('http://www.httpuseragent.org', function(status) {
    if (status !== 'success')
    {
        console.log('Unable to access network or site is down');
    }else{
        page.includeJs(
            // Include the https version, you can change this to http if you like.
            'https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js',
            function() {
                (page.evaluate(function() {
                    // jQuery is loaded, now manipulate the DOM
                    console.log(document.getElementById('myagent').textContent);
                }))
            }
        );
    }
    phantom.exit();
});

我试图获取一些插入jquery的代码,然后允许我继续执行操作,但它没有评估includeJs()

1 个答案:

答案 0 :(得分:2)

编辑:正如Vaviloff在下面的评论中所提到的,您需要订阅' page.onConsoleMessage'事件,以便在page.evaluate()回调中使用console.log()。我已更新下面的代码块以反映这一点。

以下代码将使用jQuery从页面捕获用户代理文本,并捕获已被操作的页面内容的证据。

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'Lisas headless browser';
// simple 'page.onConsoleMessage' event handler
page.onConsoleMessage = function (msg) {
  console.log('page.onConsoleMessage');
  console.log(msg);
};
page.open('http://www.httpuseragent.org', function(status) {
  if (status === 'success') {
    // capture the rendered page to 'before.jpg'
    page.render('before.jpg');
    // load the jQuery library
    page.includeJs(
      'http://code.jquery.com/jquery-1.8.2.min.js',
      function() {
        // jQuery is loaded, now manipulate the DOM
        var agent = page.evaluate(function() {
          // This code is executed within the loaded page
          // get the user agent string
          var text = $('#myagent').text();
          // log the text to the console
          console.log('Inside page.evaluate ::', text);
          // time for some mischief
          $('#myagent').html('PhantomJS Strikes Again!');
          // return the text string
          return text;
        });
        // capture the evidence
        page.render('after.jpg');
        // print the user agent text
        console.log(agent);
        // exit now
        phantom.exit(0);
      });
  } else {
    console.log('Unable to access network or site is down');
    phantom.exit(1);
  }
});

产生的控制台输出:

The default user agent is Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1
page.onConsoleMessage
Inside page.evaluate :: Your Http User Agent string is: Lisas headless browser
Your Http User Agent string is: Lisas headless browser