Вряд ли. Все дело в том, что PhantomJS работает по следующему принципу:
1. Выполняется (в контексте пустого окна «браузера» ваш скрипт).
2. Если вы изменяете свойство content, либо используете метод open(), страница (пере)загружается, управление полностью передается загружаемой странице (скрипты, загрузка изображений, составление DOM-дерева, etc).
3. По событию load страницы управление опять передается вашему скрипту, точнее он снова выполняется с самого начала (однако область видимости сохраняется).
Поэтому вашу задачу выполнить средствами PhantomJS невозможно, точнее можно, но только сам профайлер и чекер ошибок вам придется сделать самостоятельно, т.е. как в моем примере выше, только переделывая всю страницу, вешая try-catch на скрипты, или свои обработчики onerror, подмиксовывать таймеры перед вызовами и так далее, в общем писать свой полноценный дебагер, который работал бы на подобии встраиваемой части Firebug, например. В общем, задача если и выполнима, но все же трудна.
Другой вопрос, что этот функционал, а так же расширить методы работы со страницей в PhantomJS, вы можете, редактируя его исходники, ведь они открыты. На данный момент нужно либо самому писать недостающий функционал, либо ждать обновлений.
Можно, конечно, выкрутиться, использовав доступный в фантоме XHR объект, синхронным запросом взять данные, обработать его и только потом загрузить для обработки в браузере, после чего отобразить.
var address = phantom.args[0];
var output = phantom.args[1];
if (phantom.state.length === 0) {
var xmlhttp = new XMLHttpRequest();
phantom.viewportSize = { width: 800, height: 600 };
if(xmlhttp.status == 200) {
var response = xmlhttp.responseText;
/**
* Тут мы выполняем операции по очистке response от скриптов и, например
* внешних iframe и изображений с отличного от текущего домена. Но тут
* придется использовать только регулярные выражения, а не DOM.
*/
Мда, у этой библиотеки есть несколько не очевидных минусов. Как гласит вики, функция phantom.open() запускает загрузку страницы и перевыполняет скрипт, только тогда, когда загружена вся страница, включая все скрипты, картинки, внешние картинки и далее по списку. Наличие скриптов рекапчи, большого количества onload скриптов, делает загрузку страницы очень долгой, например вы можете даже увидеть подобное:
Loading time 58859 msec
Очень огорчает, что нет ни onDOMReady событий, ни возможности отключить загрузку и выполнение скриптов на странице, так что, скорее всего, для сервисов онлайн-скриншотов эта библиотека подойдет едва ли.
Вот-вот, это огромная проблема, которую хотелось бы обсудить. Что необходимо для полноценной растеризации веб-сайта через эту библиотеку? Что именно нужно из X? Возможно ли это поднять на сервере без видеокарты и так далее?
Не поймите меня неправильно, графы для анализа системы могут быть полезны во многих задачах.
Но представленные в посте — только для красоты, функциональная нагрузка практически нулевая.
Такая же польза, как от генерации фракталов.
Просмотрите изображения еще раз. Вы уверены, что они как-то приспособлены для анализа?
Трудно представить себе такую реплику:
— Вот тут посмотрите, у вас связи вокруг класса идут в форме ласточки, перепишите класс, чтобы в этом месте образовался зайчик.
1. Выполняется (в контексте пустого окна «браузера» ваш скрипт).
2. Если вы изменяете свойство content, либо используете метод open(), страница (пере)загружается, управление полностью передается загружаемой странице (скрипты, загрузка изображений, составление DOM-дерева, etc).
3. По событию load страницы управление опять передается вашему скрипту, точнее он снова выполняется с самого начала (однако область видимости сохраняется).
Поэтому вашу задачу выполнить средствами PhantomJS невозможно, точнее можно, но только сам профайлер и чекер ошибок вам придется сделать самостоятельно, т.е. как в моем примере выше, только переделывая всю страницу, вешая try-catch на скрипты, или свои обработчики onerror, подмиксовывать таймеры перед вызовами и так далее, в общем писать свой полноценный дебагер, который работал бы на подобии встраиваемой части Firebug, например. В общем, задача если и выполнима, но все же трудна.
Другой вопрос, что этот функционал, а так же расширить методы работы со страницей в PhantomJS, вы можете, редактируя его исходники, ведь они открыты. На данный момент нужно либо самому писать недостающий функционал, либо ждать обновлений.
var address = phantom.args[0];
var output = phantom.args[1];
if (phantom.state.length === 0) {
var xmlhttp = new XMLHttpRequest();
phantom.viewportSize = { width: 800, height: 600 };
xmlhttp.open('GET', address, false);
xmlhttp.send(null);
if(xmlhttp.status == 200) {
var response = xmlhttp.responseText;
/**
* Тут мы выполняем операции по очистке response от скриптов и, например
* внешних iframe и изображений с отличного от текущего домена. Но тут
* придется использовать только регулярные выражения, а не DOM.
*/
phantom.state = 'rasterize';
phantom.content = response;
}
} else {
phantom.render(output);
phantom.exit();
}
Loading time 58859 msec
Очень огорчает, что нет ни onDOMReady событий, ни возможности отключить загрузку и выполнение скриптов на странице, так что, скорее всего, для сервисов онлайн-скриншотов эта библиотека подойдет едва ли.
1. Идем на code.google.com/p/phantomjs/wiki/Installation и устанавливаем, как там написано, либо собираем, как написано на странице помощи по сборке: code.google.com/p/phantomjs/wiki/BuildInstructions
2. Устанавливаем Xvfb (frame buffer), он нужен будет для того, чтобы создать виртуальный x server.
3. Запускаем Xvfb, например со следующими параметрами:
Xvfb :1 -screen 0 1024x768x32 &
4. Теперь запускаем скрипт с первым виртуальным дисплеем:
:# DISPLAY=:1 phantomjs rasterize.js google.ru google.png
Но представленные в посте — только для красоты, функциональная нагрузка практически нулевая.
Такая же польза, как от генерации фракталов.
Трудно представить себе такую реплику:
— Вот тут посмотрите, у вас связи вокруг класса идут в форме ласточки, перепишите класс, чтобы в этом месте образовался зайчик.