2012-03-15 5 views
0

Я пытаюсь ввести Firebug & jQuery на веб-страницу с помощью PhantomJS, но я не могу получить к ним доступ.Ввод и использование Firebug-Lite с PhantomJS

Я пробовал оба метода PhantomJS для добавления других JS на страницу: page.injectJs() и page.includeJs.

Я не могу получить что-либо возвращенное из includeJs (которого я не ожидал получить, прочитав документацию).

После того, как я ввел js() и попытаюсь использовать функции или объекты firebug-lite и jQuery (например, $ and inspect()), я получаю ошибки, говорящие, что они не определены или переменная не может быть найдена.

Это мой полный сценарий. Вы также можете увидеть здесь: http://piratepad.net/XTPefXOB4o

"use strict"; 
"use warnings"; 

var page = new WebPage(), address; 
var useragent = "PhantomJS Firebug integration tool (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"; 

page.onConsoleMessage = function (msg) { 
    console.log("+eval:" + msg); 
}; 

page.open(address, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to access network'); 
    } else { 
     console.log("got into page.open()"); 

     var testInclude = page.includeJs("http://getfirebug.com/releases/lite/1.4/firebug-lite.js", function() { 
      var result = true; 
      try { 
       inspect($("*")[5]); 
      } 
      catch(err) { 
       result = false; 
      } 
      console.log("from includeJS: " + result); 
      return result; 
      // is there any way to return a value from this? 
     }); 

     var results = page.evaluate(function() {  
      var debug = []; 

      try { 
       page.injectJs("http://getfirebug.com/releases/lite/1.4/firebug-lite.js"); 
       page.injectJs("http://pconerly.webfactional.com/site_media/js/jquery-1.7.min.js"); 
      } catch(err) { 
       debug[0] = false; 
      } 
      debug[0] = true; 

      debug[1] = true; 
      try { 
       // all 3 of these commands fail. 
       //$(document); 
       inspect(document.querySelectorAll("*")[i]); 
       //firebug; 
      } 
      catch(err) { 
       console.log(err.message) 
       debug[1] = false; 
      } 

      //debug[1] = inspectAEl(5); 

      return debug; 
     }); 

     var stuff = results; 
     console.log("did not error on injecting JS: " + stuff[0]); 
     console.log("used inspect within page.evaluate: " + stuff[1]); 

     console.log("return value from includeJs: " + testInclude); 

     console.log("processing finished");    
    } 
    phantom.exit(); 
});  

Это мой выход:

$ phantomjs firebug-integration.js 
got into page.open() 
+eval:Can't find variable: inspect 
did not error on injecting JS: true 
used inspect within page.evaluate: false 
return value from includeJs: undefined 
processing finished 

ответ

2

Вы получили некоторую путаницу здесь вокруг контекста каждой функции:

  • Когда ты запустите includeJs(url, callback), функция callback работает в контексте PhantomJS. Таким образом, он имеет доступ к page, но не имеет доступ к переменным и пространствам имен, созданным включенным сценарием, - они были включены в контекст и будут доступны для функций, которые вы выполняете через page.evaluate().

  • Вы пытаетесь запустить page.injectJs() в пределах page.evaluate(). Это не сработает - функция, которую вы запускаете в page.evaluate(), изолирована в контексте выполнения клиента и не имеет доступа к объекту page.

Таким образом, вы должны попробовать один из этих подходов - либо запустить page.evaluate() в page.includeJs() обратного вызова:

page.includeJs("http://getfirebug.com/releases/lite/1.4/firebug-lite.js", 
     function() { 
      page.evaluate(function() { 
       // do stuff with firebug lite here 
       console.log(inspect($("*")[5])); 
      }); 
     }); 

или запустить page.injectJs() и затем выполнения page.evaluate():

// note - this is a reference to a local file 
page.injectJs("firebug-lite.js"); 
page.evaluate(function() { 
    // do stuff with firebug lite here 
    console.log(inspect($("*")[5])); 
});