2017-01-19 45 views
2

考虑下面的代码...PhantomJS includeJs()+嵌套评估()不工作

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()

回答

2

编辑:由于在下面的评论中提到的Vaviloff,你需要订阅的page.onConsoleMessage“事件才能使用的console.log()的page.evaluate内( ) 回电话。我更新了下面的代码块来反映这一点。

以下代码将使用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 
+3

嗯,其实他可以使用的console.log page.evaluate内。只需要使用[page.onConsoleMessage](http://phantomjs.org/api/webpage/handler/on-console-message.html)订阅来自控制台的消息。 – Vaviloff

+0

谢谢。我学到了新东西 - 我会更新答案。 –