Xvfb + firefox: как узнать, что Firefox заканчивает рендеринг? - PullRequest
2 голосов
/ 01 октября 2011

Я пытаюсь получить веб-эскизы, используя X-сервер для запуска Firefox в безголовом (Xvfb) X11.

Я ищу способ узнать, когда Firefox завершил рендеринг, и затем я могу использовать графические программы для захвата окон.

Проблема: Я могу НЕ определяет, когда Firefox заканчивает рендеринг.Все, что я знаю, это то, что строка состояния должна иметь вывод «Done» после завершения рендеринга (IE, как показано в Firefox в GUI).

Может кто-нибудь знать, что я могу использовать, чтобы определить, заканчивается ли Firefoxрендеринг страницы или нет?

Я просто спал 40 секунд, но это не всегда работает.

Среда: Centos 5.7, Xvfb, Firefox 3.6.23

Команды оболочки:

Xvfb: 1 -screen 0 1024x768x24 &

export DISPLAY=localhost:1.0

DISPLAY=localhost:1.0 firefox http://www.example.com -width 1024 -height 768

sleep 40  **[ NEED some thing to tell me if Firefox finishes rendering ]**

DISPLAY=localhost:1.0 import -window root example.com.png

pkill firefox

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Три метода с макушки головы.

  1. Напишите ваше собственное расширение, которое подключается к window.onload и запускает захват изображения.
  2. Напишите скрипт greasemonkey, который подключается к window.onload и запускает оповещение. Дождитесь такого оповещения, затем запустите захват изображения.
  3. Периодически захватывайте изображение кнопки «Стоп» (должно быть в известных координатах относительно окна) и анализируйте ее цвет. Если он отключен, рендеринг завершен.
0 голосов
/ 28 октября 2011

Обратите внимание, что я не думаю, что это может быть легко сделано с FF 4.x и выше. Это связано с «особенностями» этих версий. Я рекомендую вам использовать другой браузер, если вы можете, например, Opera . Я еще не проверял это сам, но я думаю, что он не имеет всех тех недостатков, замеченных с FF. Смотри ниже.

В вашем случае может быть эффективным следующее решение:

Напишите некоторый скрипт Greasemonkey, который добавляет абсолютный позиционированный прямоугольник где-нибудь на экране.

Пусть этот прямоугольник вспыхнет за 3 цикла после завершения загрузки страницы: красный, синий, прозрачный

Напишите сценарий, который ожидает, по крайней мере, 2 таких цикла, чтобы завершить (чтобы он видел красный, синий, что-то, красный, синий), а затем сделайте снимок экрана с правильным временем в прозрачной фазе.

Это должно быть выполнимо с X11 и VNC и аналогичными. Извините, что у меня нет лучшего решения или кода, который я могу представить здесь.

Я, со своей стороны, решил бы это, используя EasyRFB, который я написал для решения подобных вещей. Однако я не могу рекомендовать это вам, за исключением случаев, когда вы очень отчаянный Genius, способный легко читать и понимать ужасные недокументированные фрагменты кода;)


Кстати, спасибо, что обратили внимание на идею пакета, способного снимать скриншоты с произвольных веб-страниц, что делает отличный вариант использования для EasyRFB. Никогда раньше не думал об этом сам.

Глядя на GitHub, я заметил, , что там есть некоторые решения для создания веб-скриншотов на основе Selenium или WebKit. Они, безусловно, хороши для рекламных снимков, но, по-видимому, они не могут охватить общий случай использования пользователями веб-страниц.

Возможно, было бы интересно иметь возможность автоматизировать скриншоты с произвольных страниц, как это видно в Windows 95 IE 4, FF 1 или Debian Potato с Chimera и т. Д. Я посмотрю на это;)


Обратите внимание, что есть еще одна публикация Stackoverflow от меня.

Есть кое-что, что я называю EasyRFB, которое я написал в виде смеси Python (ядро), PHP (небольшие веб-помощники) AJAX и bash (управляющие сценарии). Он был протестирован с XVnc, но должен работать с любым VNC. Он каким-то образом может делать то, что вы хотите, но будьте осторожны, это код разработки, недокументированный, сложный и ужасно написанный и может быть ошибочным. Вы можете найти его там:

Написано для следующих целей:

  • Возможность управлять удаленным графическим интерфейсом с мобильного телефона даже в ситуации, когда интернет-соединение крайне медленное и крайне ненадежное
  • Полная автоматизация пользовательского интерфейса / замена мыши с помощью командной строки
  • Автоматизированные тесты QA, основанные на том, что видит пользователь, в отличие от того, что видит браузер или какая-либо шпионская программа Windows, в случаях, когда выходные данные не обязательно должны быть также идеальными для пиксельного цвета

Он не был написан, чтобы быть быстрым, эффективным или легким в использовании, ни для других (пока). У меня как-то работает.

Что он делает:

  • является веб-ориентированным и дает AJAX веб-интерфейс VNC серверам, как угодно.
  • поддерживает высокую степень сжатия .jpg, обновляя содержимое экрана.
  • может делать снимки экрана без потерь
  • способен нечетко сопоставлять шаблоны с содержимым экрана
  • шаблоны могут быть отредактированы с помощью edit.html - однако этот редактор является базовым, не требующим пояснений и совсем не документированным
  • Могут быть написаны сценарии оболочки, которые могут ожидать совпадения этих шаблонов и отправлять команды, такие как нажатия клавиш, перемещения мыши и щелчки, на VNC
  • Есть несколько .sh скриптов, которые могут помочь понять, как это делается, но я пока не могу опубликовать действительно полезные материалы, извините

Ничего не задокументировано, и я не могу объяснить, как его использовать. Либо вы узнаете себя, либо потерялись. Сожалею. Лучше даже не смотрите на это, это может повредить вам.


А теперь о проблемах, замеченных с FF при выполнении всего этого:

Более новые версии FF не могут корректно обновлять экран. Последняя известная версия, которая корректно работала на моей стороне, была серия FF 3.6, все позже иногда развивалось странное поведение.

Например:

  • Более новые версии теперь обновляют состояние до обновления содержимого экрана.
  • Кроме того, они имеют такой высокий спрос на ЦП и память, что выполнение последнего шага по обновлению экрана может занять некоторое время. На медленном оборудовании (например, NSLU2 , никогда не тестировалось), я думаю, что это может занять даже минуты после того, как счетчики и т. Д. Уже находятся в «готовом» состоянии.

Таким образом, даже глядя на спиннер, чтобы стать серым, включая (!) Наивные решения Greasemonkey, которые уведомляют о «onload ()», оба сбоят с FF 4.x и выше, потому что части экрана могут все еще не обновляться при обнаружении этого оно готово.

Возможно, это связано только с XVnc, возможно, в моих скриптах есть ошибка, которая вызывает все это, но с FF 3.x все было правильно, и я думаю, что возврат к старой версии немедленно решит все эти проблемы. видел. (Но у меня уже есть обходные пути для всех этих проблем. Но я не могу опубликовать эти сценарии, извините.)

Становится хуже.

FF 4.x и выше, по-видимому, немного задерживают обработку события. Поэтому выпрыгивание мыши из полосы прокрутки часто держит ее выделенной, я думаю, что событие не достигает полосы прокрутки.

На обычном рабочем столе вы не прыгаете мышью, но мое решение способно это сделать. Исправление состоит в том, чтобы генерировать дополнительные, лишние события движения мыши, чтобы FF делал правильные вещи.

Также я заметил, что я действительно понятия не имею, происходит ли это из-за FF или веб-страниц, показанных в FF, что иногда вещи не попадают туда, где они должны быть. Я никогда не наблюдал этого раньше с FF 3.x, хотя. Хитрость, которая решает эту проблему, заключается в перезагрузке страницы. Возможно, это связано с добавочными обновлениями экрана, но я еще не углублялся в это, поскольку повторная попытка (автоматическое нажатие на кнопку перезагрузки) работает для меня.

...