PhantomJS
PhantomJS — это безголовый (headless) веб-браузер на основе движка WebKit, работающий из командной строки и не имеющий графического интерфейса. Он предназначен для автоматизации взаимодействия с веб-страницами, выполнения JavaScript, рендеринга страниц в файлы (изображения, PDF) и проведения тестирования веб-приложений. Проект был разработан Виталием Слободяном и впервые выпущен в 2011 году.
История
Разработка PhantomJS началась в 2011 году как попытка создать инструмент для автоматизации веб-браузера без графического интерфейса, который мог бы выполняться на серверах и в средах непрерывной интеграции. Первая версия, PhantomJS 1.0, была выпущена в январе 2012 года. Она базировалась на движке WebKit и JavaScript-движке JavaScriptCore (из состава WebKit).
В 2013 году вышла версия 1.9, которая добавила поддержку WebSocket и улучшила работу с сетью. В 2015 году, с выходом версии 2.0, PhantomJS перешёл на более современную версию WebKit (из состава Qt 5.4), что позволило поддерживать HTML5, CSS3 и новые возможности JavaScript.
В 2017 году разработчик проекта объявил о приостановке активной разработки, сославшись на сложности поддержки и конкуренцию со стороны более современных инструментов, таких как Headless Chrome (режим безголового браузера в Google Chrome, запущенный в 2017 году). Последняя стабильная версия, PhantomJS 2.1.1, была выпущена в январе 2016 года. Проект остаётся доступным для скачивания, но не получает обновлений и исправлений безопасности.
Архитектура и принцип работы
PhantomJS работает как безголовый браузер, что означает, что он полностью загружает и обрабатывает веб-страницы, включая выполнение JavaScript, загрузку CSS, изображений и других ресурсов, но не отображает их на экране. Вместо этого он предоставляет программный интерфейс (API) для управления браузером из скриптов на JavaScript.
Основные компоненты
- WebKit: движок рендеринга, отвечающий за отображение HTML, CSS и выполнение JavaScript. PhantomJS использует версию WebKit, взятую из библиотеки Qt.
- Qt: кроссплатформенная библиотека, обеспечивающая работу с сетью, файловой системой, графикой и другими системными ресурсами. PhantomJS использует Qt для создания окна браузера (которое не отображается) и для обработки запросов.
- JavaScript API: PhantomJS предоставляет глобальный объект
phantom, а также объекты для работы с веб-страницами (WebPage), файловой системой (fs), системой (system) и другими функциями.
Режимы работы
PhantomJS может работать в двух основных режимах:
- Автономный скрипт: пользователь пишет JavaScript-файл, который запускается с помощью PhantomJS. В этом скрипте можно создавать веб-страницы, загружать URL, выполнять действия (клики, заполнение форм) и получать результаты.
- Интерактивный режим: PhantomJS может использоваться как REPL (Read-Eval-Print Loop) для выполнения отдельных команд JavaScript.
Применение
PhantomJS нашёл широкое применение в веб-разработке, тестировании и автоматизации.
Автоматизированное тестирование
Одним из главных применений PhantomJS было проведение модульных и интеграционных тестов веб-приложений. Он позволял запускать тесты без открытия браузера, что значительно ускоряло процесс и позволяло интегрировать тестирование в системы непрерывной интеграции (CI). Популярные фреймворки для тестирования, такие как Jasmine, Mocha и QUnit, имели адаптеры для работы с PhantomJS.
Скриншоты и рендеринг
PhantomJS позволял создавать скриншоты веб-страниц в форматах PNG, JPEG, GIF и PDF. Это использовалось для:
- Создания превью веб-сайтов: автоматическое создание миниатюр страниц для каталогов или социальных сетей.
- Верификации вёрстки: сравнение скриншотов разных версий страницы для обнаружения визуальных регрессий.
- Генерации PDF-отчётов: создание PDF-документов на основе HTML-шаблонов.
Веб-скрапинг (парсинг)
PhantomJS позволял извлекать данные с динамических веб-страниц, которые генерируют контент с помощью JavaScript. В отличие от простых HTTP-запросов, PhantomJS выполнял JavaScript, загружал AJAX-запросы и отображал конечный HTML-код, который можно было проанализировать.
Мониторинг и анализ
PhantomJS мог использоваться для мониторинга доступности и производительности веб-сайтов. Он мог записывать время загрузки страниц, количество запросов, размеры ресурсов и другие метрики.
Автоматизация действий
PhantomJS позволял автоматизировать рутинные действия в веб-интерфейсах, такие как:
- Заполнение и отправка форм.
- Навигация по сайту.
- Сбор данных из личных кабинетов (при наличии авторизации).
Пример использования
Простой скрипт на PhantomJS для создания скриншота веб-страницы:
``javascript var page = require('webpage').create(); page.open('http://example.com', function(status) { if (status === 'success') { page.render('example.png'); } phantom.exit(); }); ``
Этот скрипт загружает страницу http://example.comexample.png`., и если загрузка прошла успешно, сохраняет её скриншот в файл
Критика и ограничения
Несмотря на популярность, PhantomJS имел ряд недостатков и ограничений:
- Устаревший движок WebKit: последняя версия PhantomJS базировалась на WebKit 2015 года, который не поддерживал многие современные веб-стандарты (например, ES6, CSS Grid, Flexbox в полном объёме).
- Отсутствие поддержки: проект был заморожен в 2017 году, и с тех пор не выпускалось обновлений, включая исправления безопасности.
- Сложность отладки: из-за отсутствия графического интерфейса отладка скриптов была затруднена. Разработчикам приходилось полагаться на логи и консольный вывод.
- Производительность: для некоторых задач PhantomJS работал медленнее, чем современные безголовые браузеры, такие как Headless Chrome.
- Ограниченная поддержка JavaScript: из-за устаревшего движка JavaScriptCore некоторые современные функции JavaScript могли не работать.
Замена и альтернативы
После прекращения активной разработки PhantomJS его место заняли более современные и поддерживаемые инструменты:
- Headless Chrome: встроенный режим безголового браузера в Google Chrome, запущенный в 2017 году. Он использует актуальный движок Blink и V8, поддерживает все современные веб-стандарты и имеет богатый API через Puppeteer.
- Puppeteer: библиотека Node.js, предоставляющая высокоуровневый API для управления Headless Chrome. Она стала де-факто стандартом для автоматизации браузера.
- Playwright: библиотека от Microsoft, аналогичная Puppeteer, но поддерживающая несколько браузеров (Chromium, Firefox, WebKit).
- Selenium WebDriver: более старый, но всё ещё широко используемый инструмент для автоматизации браузеров, который поддерживает Headless Chrome, Firefox и другие браузеры.
Интересные факты
- PhantomJS был одним из первых популярных безголовых браузеров, что сделало его пионером в области автоматизации веб-тестирования.
- Название «PhantomJS» происходит от слов «phantom» (призрак) и «JS» (JavaScript), что отражает его суть — невидимый браузер, управляемый JavaScript.
- Проект был написан на C++ и JavaScript, а его исходный код был доступен на GitHub под лицензией BSD.
- Несмотря на заморозку, PhantomJS до сих пор используется в некоторых устаревших проектах и системах, которые не были обновлены.
Источники
- Официальный сайт проекта PhantomJS (архивная версия)
- Репозиторий PhantomJS на GitHub
- Документация по PhantomJS API
- Статья «Headless Chrome: an answer to PhantomJS» в блоге Google Chrome
- Статья «PhantomJS is dead, long live Headless Chrome» на сайте InfoWorld
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →