Инъекция и использование Firebug-Lite с PhantomJS - PullRequest
0 голосов
/ 16 марта 2012

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

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

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

После того, как я использую injectJs () и пытаюсь использовать функции или объекты firebug-lite и jQuery (например, $ и 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

1 Ответ

2 голосов
/ 16 марта 2012

У вас есть некоторая путаница в контексте контекста каждой функции:

  • Когда вы запускаете includeJs(url, callback), функция callback запускается в контексте PhantomJS.Таким образом, он имеет доступ к page, но не имеет доступ к переменным и пространствам имен, созданным включенным сценарием - они были включены в контекст client и будут доступны для функцийвы пробегаете через 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]));
});
...