Injecter et utiliser Firebug-Lite avec PhantomJS

J'essaie d'injecter Firebug & jQuery dans une page Web à l'aide de PhantomJS, mais je ne peux pas y accéder.

J'ai essayé les deux méthodes PhantomJS pour ajouter d'autres JS à une page: page.injectJs () et page.includeJs.

Je ne peux rien renvoyer de l'inclusion (ce que je ne prévoyais pas obtenir, de lire la documentation).

Après avoir injecté Js () et essayer d'utiliser les fonctions ou les objets de firebug-lite et jQuery (comme $ et inspect ()), j'ai des erreurs indiquant qu'ils sont indéfinis ou que la variable ne peut être trouvée.

C'est mon script complet. Vous pouvez également le voir ici: 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(); }); 

C'est ma sortie:

 $ 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 

Vous avez une certaine confusion ici autour du contexte de chaque fonction:

  • Lorsque vous exécutez includeJs(url, callback) , la fonction de callback s'exécute dans le contexte PhantomJS. Il a donc accès à la page , mais n'a pas accès aux variables et aux espaces de noms créés par le script inclus – ceux-ci ont été inclus dans le contexte du client et seront disponibles pour les fonctions que vous exécutez via page.evaluate() .

  • Vous essayez d'exécuter page.injectJs() dans page.evaluate() . Cela ne fonctionnera pas – la fonction que vous exécutez dans page.evaluate() est en page.evaluate() de page.evaluate() dans le contexte d'exécution du client et n'a pas accès à l'objet de la page .

Donc, vous devriez essayer une de ces approches – soit exécuter page.evaluate() dans la page.includeJs() rappel:

  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])); }); }); 

Ou exécutez page.injectJs() , puis exécutez 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])); });