Selenium vs Puppeteer: что выбрать?

Комментарии: 0

Когда речь идет об автоматизированном взаимодействии с браузером, тестировании приложений, парсинге веб-страниц или выполнении задач с помощью скриптов, два самых популярных инструмента, которые рекомендуем рассмотреть, — это Puppeteer и Selenium. Оба фреймворка предлагают мощные возможности для взаимодействия с интернет-ресурсами, но их ключевые функции и особенности работы могут значительно отличаться. Важно понимать, в каких случаях и для каких целей лучше выбрать один из этих инструментов. Поэтому в данной статье мы рассмотрим основные различия между ними в формате Puppeteer vs Selenium, чтобы помочь вам принять обоснованное решение в зависимости от целей и предпочтений.

Что такое Selenium?

Selenium — это полноценный набор программ с открытым исходным кодом, который предназначен для автоматизированного управления браузером, тестирования сайтов и парсинга данных.

Состоит этот набор из таких компонентов, как WebDriver, IDE, Remote Control, Grid и Server, которые немного отличаются по своей реализации, однако конечный результат у всех один — имитация действий пользователя в браузере в соответствии с заданным алгоритмом.

Инструмент поддерживает работу с многими браузерами, а также совместим со всеми операционными системами.

Взаимодействие с браузером возможно при соблюдении следующих условий:

  1. На компьютере установлена среда разработки. К примеру, Visual Studio, IntelliJ IDEA, Apache.
  2. В виртуальном окружении подтянута одноименная библиотека.
  3. Установлен совместимый браузер для запуска тестов или скрапинга данных.
  4. Инициализирован WebDriver в соответствии с версией и типом обозревателя.

Если вышеуказанные условия соблюдены, алгоритм управления браузером будет следующим:

  • Пишем код на совместимом языке программирования. ⇒ Запускаем код. ⇒ Код обращается к Driver. ⇒ Driver делегирует полномочия WebDriver (ChromeDriver, FirefoxDriver и т.д.). ⇒ WebDriver переводит код в команды и говорит, что делать. ⇒ Браузер обрабатывает запрос и возвращает ответ.

Такие действия в обозревателе необходимы для выполнения следующих сценариев:

  • Функциональное тестирование веб-приложений;
  • Кроссплатформенное тестирование;
  • Автоматизация загрузки и скачивания файлов;
  • Проверка скорости загрузки сайта или Page Speed Insights;
  • Создание скриншотов и анализ их содержимого;
  • Извлечение метаданных веб-страницы;
  • Скрапинг ссылок, текста, изображений, атрибутов HTML-элементов;
  • Парсинг других данных с динамических веб-ресурсов, где контент подгружается через AJAX или другие асинхронные методы.

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

Что такое Puppeteer?

Puppeteer — это относительно новая разработка для дистанционного управления headless-версией Google Chrome. Она представляет собой библиотеку для Node.js, с помощью которой можно автоматизировать процессы в браузере, используя высокоуровневый API и протокол Chrome DevTools.

Для взаимодействия с этой библиотекой необходимы навыки работы с командной строкой и базовые знания синтаксиса JavaScript.

Как и в случае с первым инструментом, для его запуска потребуется выполнить ряд несложных действий:

  1. Скачать и установить актуальную версию Node.js. Вместе с Node будет установлен npm (пакетный менеджер).
  2. Создать папку проекта.
  3. В npm, используя команду npm install puppeteer, подключить библиотеку.

Если все настройки были выполнены правильно, то взаимодействие с браузером будет построено по следующему сценарию:

  • Библиотека обращается к DevTools Protocol. ⇒ Протокол проходит через WebSocket к браузеру. ⇒ Браузер получает и обрабатывает команду. ⇒ Возврат ответа.

Как видим, сценарии взаимодействия с браузером отличаются между собой. Если для первого инструмента нужна среда разработки и WebDriver, который обращается к обозревателю через его интерфейс, то второй запускается с помощью пакетного менеджера Node.js и управляет Google Chrome через JavaScript-ориентированный протокол DevTools.

Такой способ взаимодействия с браузером очень выгоден в условиях работы с веб-сайтами, которые сильно зависят от AJAX, так как не все инструменты позволяют корректно обрабатывать динамический контент.

К основным сценариям использования можно отнести:

  • Тестирование динамических веб-страниц и приложений;
  • Веб-скрапинг;
  • Эмуляцию действий пользователя для проверки форм и физического взаимодействия с элементами страниц;
  • Генерацию PDF: загрузка и конвертация страниц сайта в файл PDF формата;
  • Тестирование производительности: захват трассировок временной шкалы и прочих метрик для последующего анализа данных;
  • Рендеринг веб-страницы — получение DOM-дерева с последующим разделением на HTML, CSS, JavaScript элементы.

Этот перечень возможностей далеко не полный. Инструмент работает в headless-режиме, используя протокол DevTools и WebSocket-соединение, что позволяет сторонним инструментам для тестирования или автоматизации отправлять команды и получать данные из Chrome.

Puppeteer vs Selenium: ключевые различия

Выше мы обозначили, что Puppeteer работает в основном с Google Chrome, а Selenium поддерживает множество других браузеров. Это одно из ключевых, но не главных отличий двух инструментов.

Для более глубокого анализа мы подобрали другие критерии оценивания, которые представлены в таблице “Puppeteer vs Selenium” ниже.

Характеристика Selenium Puppeteer
Поддержка операционных систем Windows, Linux, macOS Windows, Linux, macOS
Поддержка языков программирования Java, Python, Ruby, C#, JavaScript, Kotlin и другие JavaScript
Инсталляция Среда разработки, драйвер под каждый браузер, дополнительные библиотеки Node.js и пакетный менеджер
Управление WebDriver Chrome DevTools Protocol
Производительность Высокое потребление ресурсов ОЗУ, ЦП, так как работает с интерфейсами Минимальное потребление ресурсов ОЗУ, ЦП, так работает в режиме headless
Тестовые платформы Веб и мобильные Веб
Интеграция Совместимость с другими инструментами и библиотеками для тестирования и скрапинга Поддержка ограничивается совместимостью с инструментами для Google Chrome
Документация Есть туториалы, служба поддержки и форум Есть туториалы, неофициальные форумы

Виды тестирования

  • Кроссплатформенное;
  • Функциональное;
  • Тестирование производительности;
  • UI-тестирование;
  • Интеграционное.
  • Функциональное;
  • Тестирование производительности;
  • UI-тестирование. /ul>

Скрапинг

  • Текст;
  • Атрибуты HTML;
  • Данные форм;
  • Данные динамического контента;
  • Ссылки;
  • Изображения.
  • Текст + PDF;
  • Атрибуты HTML;
  • Данные форм;
  • Данные динамического контента;
  • Ссылки;
  • Изображения и медиа.

Из представленных в таблице характеристик видим, что оба инструменты похожи между собой, но подходят не под все задачи одинаково.

Puppeteer vs Selenium: Сравнение производительности

Когда речь идет о скорости выполнения операций, оба инструменты кардинально отличаются между собой. Это нужно учитывать, если вы планируете работать с большим объёмом данных или скрапить сайты, использующие JavaScript.

Предлагаем сравнить производительность с учетом нескольких параметров.

Скорость запуска браузера

Этот показатель напрямую зависит от способа обращения к браузеру.

Выше мы упоминали, что Selenium взаимодействует с обозревателем через его интерфейс, посредством специального WebDriver, который, по сути, образовывает дополнительный слой и увеличивает время запуска программы.

Между Puppeteer и браузером нет посредника. Подключение осуществляется через протокол DevTools напрямую, а поэтому скорость запуска обозревателя намного выше, чем в случае с Selenium.

Время обработки элементов DOM

WebDriver взаимодействует с DOM (Document Object Model), используя клиент-серверную архитектуру, где Selenium WebDriver — клиент, а, к примеру, ChromeDriver — сервер. Время обработки такой модели зависит от типа драйвера, а также структуры дерева. Если страница реализована под JavaScript, то время обработки DOM увеличивается.

Puppeteer, заточенный под Chromium, работает с DOM быстрее, благодаря нескольким ключевым аспектам: прямому использованию DevTools Protocol, асинхронной модели взаимодействия, и отсутствию промежуточного слоя, такого как WebDriver. Однако его нельзя использовать с другими браузерами, а поэтому сравнение в этой категории будет не до конца объективным.

Влияние основных компонентов

Selenium использует WebDriver, который преобразует команды в JSON-запросы. Через HTTP-протокол эти запросы направляются к соответствующему драйверу, к примеру, SafariDriver, который далее передает команды браузеру, где они обрабатываются и возвращаются в виде JSON-ответов. Такая особенность работы WebDriver влияет на скорость запросов и ответов, а поэтому ее можно обозначить как низкую.

1.jpg

В Puppeteer соединение с браузером устанавливается через WebSocket, который образовывает двустороннюю связь между клиентом и браузером. Это соединение работает поверх TCP, что позволяет эффективно обмениваться данными в режиме реального времени с использованием механизмов шифрования и аутентификации. Это позволяет защитить информацию от несанкционированного доступа.

2.jpg

Скорость рендеринга

В Selenium отслеживать точные метрики времени рендеринга достаточно сложно. Для этого нужно устанавливать дополнительные библиотеки. Стандартные возможности инструмента в этом вопросе ограничены.

Рендеринг страниц с Puppeteer происходит быстрее, так как он напрямую работает с Chromium, минуя дополнительные слои взаимодействия.

Веб-скрапинг: Puppeteer vs Selenium

В вопросе веб-скрапинга оба эти инструмента показывают хорошие результаты. Поэтому выбор одного из них зависит только от поставленных задач.

Puppeteer подходит для:

  • Быстрого парсинга веб-страниц;
  • Сбора медиа данных, так как Selenium не работает с видео и аудио, а только с графическим контентом;
  • Генерации HTML страницы в PDF формат;
  • Скрапинга сайтов с ограничениями и защитой от ботов.

Selenium подходит для:

  • Веб-скрапинга страниц, где данные загружаются динамически с помощью JavaScript и важна кроссплатформенность;
  • Для парсинга Single Page Applications (SPA), где контент меняется без перезагрузки страницы;
  • Когда необходимо взаимодействовать с элементами на странице (клики, скроллинг, заполнение форм).

Для более глубокого парсинга в обоих инструментах можно использовать Xpath, CSS-селекторы и другие методы, которые позволяют максимально точно находить нужные инструменты на странице.

Puppeteer vs Selenium в использовании с Python

Если сравнивать оба инструменты в контексте использования с Python, важно отметить различие в библиотеках, синтаксисе, интеграции в проект. Поэтому предлагаем разобраться, как каждый из них работает с Python.

Selenium с Python

В одной из более ранних тем мы обсуждали настройку прокси для Selenium с Python и определили, что они в связке с промежуточным сервером помогают тестировать сайты и скрапить ресурсы с различными ограничениями.

Selenium в Python — это официальная библиотека, которая регулярно получает обновления, улучшающие функциональность инструмента и расширяя его область применения. Предлагаем рассмотреть пример её инсталляции и запуск браузера посредством WebDriver.

Для установки в среде разработки вводим команду:


pip install selenium

Далее нужно загрузить WebDriver в соответствии с версией установленного браузера:


from selenium import webdriver

# Создаем объект браузера, в коде меняем путь к вашему веб-драйверу
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

Для запуска браузера и перехода на сайт с целью поиска какого-то элемента используем команды “get” и “findElement”.


# Открываем сайт
driver.get('https://example.com')

# Извлекаем текст из элемента
element = driver.find_element_by_tag_name('h1')
print(element.text)

# Закрываем браузер
driver.quit()

Как видим, Selenium использует синхронный подход, и весь код выполняется последовательно, что удобно при поиске ошибок.

Puppeteer с Python

В Python нет официальной библиотеки. Есть обертка с таким же названием, которую можно установить с помощью следующей команды:


npm install puppeteer

Далее инструмент скачивает Chromium автоматически, так что не нужно отдельно устанавливать драйвера.

Для запуска браузера и извлечения картинки, можно запустить следующий код:


//adding library
const pt = require('puppeteer');
pt.launch().then(async browser => {
//browser new page
const p = await browser.newPage();
//set viewpoint of browser page
await p.setViewport({ width: 1000, height: 500 })
//launch URL
await p.goto('https://proxy-seller.com')
//capture screenshot
await p.screenshot({
path: 'proxy-seller.png'
});
//browser close
await browser.close()
})

Как видим, код на Python более компактный и удобный, особенно при работе с асинхронными задачами. Однако учитывая отсутствие официальной библиотеки и дополнительных инструкций, использование этого инструмента может быть сложным, особенно для тех, кто не имеет знаний программирования.

Функциональные возможности

При выборе инструмента для автоматизации браузера важно учитывать функциональные возможности таких популярных решений, как Selenium и Puppeteer. Оба предлагают широкий набор функции для взаимодействия с веб-страницами, однако наличие некоторых особенностей может повлиять на выбор одного из них.

Поддержка браузеров

Сравнивая работу с браузерами, можно отметить, что Selenium совместим с Google Chrome, Mozilla Firefox, Internet Explorer, Microsoft Edge, Opera, Safari. Это делает его предпочтительным инструментом для кросс-браузерного тестирования и работы в специфических условиях, например, при необходимости тестирования на разных операционных системах (Safari на macOS).

С другой стороны, Puppeteer лучше всего подходит для работы с Google Chrome, экспериментальной версией Mozilla Firefox, но это ограничивает его использование в проектах, где требуется полноценная поддержка нескольких браузеров.

Headless-режим и эффективность автоматизации

Headless или “безголовый режим” — это способ запуска браузера без графического интерфейса для увеличения производительности и экономии ресурсов системы. Оба инструменты поддерживают работу в headless-режиме, но каждый из них реализует это по-своему.

В случае с Selenium используется флаг --headless, который отключает графический интерфейс и позволяет запускать и выполнять тестовые сценарии намного быстрее.


from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')  # Включаем headless-режим

Важно отметить, что в этом режиме работают только Google Chrome и Microsoft Edge. Однако они эффективно справляются с такими задачами, как кросс-браузерное и функциональное тестирование, заполнение форм, полей, а также парсинг данных.

Что же касается Puppeteer, то он изначально ориентирован на работу в headless-режиме, который включен в нем по умолчанию. Для проверки можно посмотреть, чтобы в коде параметр “headless” был установлен как “true”.


const browser = await puppeteer.launch({ headless: true });  // по умолчанию включен headless-режим

С headless-режимом этот инструмент быстро загружает страницы, которые активно взаимодействуют с сервером через JavaScript, делает скриншоты страниц, записывает видео взаимодействий с сайтом. Это может быть полезно для отладки, создания отчетов или анализа поведения пользователей.

Также Puppeteer подходит для интеграции с CI/CD системами, позволяя запускать автоматические скрипты и парсить данные на сервере. Если во время сбора данных вам нужно скрыть свой реальный IP-адрес, то тема как настроить прокси в Puppeteer поможет решить эту задачу.

Исполнение JavaScript и взаимодействие с DOM

Selenium поддерживает работу с динамическим контентом через запуск команды execute_script().

WebDriver передает эту команду браузеру через стандартные API (в данному случае это ChromeDriver, GeckoDriver и другие) и обрабатывает ее в конце кода.

Почему выполнение кода откладывается?

Если страница использует асинхронный JavaScript, то Selenium может не сразу увидеть изменения на странице, так как они загружаются с определенной задержкой. В этом случае нужно применить явные ожидания (например, WebDriverWait), чтобы обработать динамический контент.

Кроме работы с JavaScript, Selenium взаимодействует с HTML и CSS элементами, которые формируют DOM. Взаимодействуя с объектной моделью документа, фреймворк ищет на странице элементы посредством их ID (find_element_by_id()), имени (find_element_by_name()), Xpath (find_element_by_xpath()), а также может выполнять клики, вставлять текст в формы и поля, извлекать данные (текст, изображения, файлы, ссылки).

Единственным недостатком этого инструмента в контексте работы с JS и DOM является его прямая зависимость от драйвера, который может иметь ограниченный доступ к некоторым функциям браузера.

Для работы с JS Puppeteer использует команду page.evaluate(), которая запускает произвольный JavaScript-код непосредственно в контексте самого браузера.

Для взаимодействия с DOM в нем имеются такие методы, как page.$() и page.$$(). Эти методы позволяют находить элементы на странице, изменять их, извлекать данные, работать с текстом, формами и полями. При этом взаимодействие с DOM осуществляется напрямую, без дополнительного драйвера.

Преимущества и недостатки программ

Анализируя функционал и удобство использования таких инструментов, как Selenium и Puppeteer, можно выделить их преимущества и недостатки.

Плюсы Selenium:

  • Совместимость с большинством существующих браузеров и ОС;
  • Поддержка многих языков программирования;
  • Возможность интеграции сторонних инструментов;
  • Подходит для выполнения сложных многозадачных тестов;
  • Есть официальная поддержка и широкое комьюнити.

Ключевым недостатком этого инструмента является зависимость от WebDriver, что напрямую влияет на производительность при выполнении сценариев.

Плюсы Puppeteer:

  • Является официальной разработкой Google, а поэтому подходит для работы с Chrome и Chromium;
  • Высокое быстродействие при работе с динамическим контентом;
  • Headless-режим, который подходит для серверных приложений, где запуск браузера без графического интерфейса позволяет существенно повысить производительность;
  • Простота в использовании: нет необходимости загружать дополнительные драйвера и настраивать среду разработки.

Недостатком работы с этой библиотекой является ее ограниченная поддержка браузеров, что существенно сужает круг возможных задач.

Заключение

Selenium и Puppeteer — популярные инструменты среди программистов, AQA-специалистов, DevOps, а также экспертов по SEO и веб-скрапингу.

Чтобы можно было выбрать лучший инструмент под конкретную задачу, важно учитывать ключевые факторы, такие как тип проекта, поддержка браузеров, производительность, способность работать с динамическим контентом.

Selenium будет лучшим выбором, если ваша задача включает в себя сложные тестовые сценарии, которые должны быть проверены на нескольких платформах и браузерах. Он поддерживает множество обозревателей и предоставляет гибкость для работы с различными языками программирования.

Puppeteer больше ориентирован на Chrome и Chromium. Он обеспечивает высокую производительность, особенно когда речь идет о работе с динамическим контентом и обработке JavaScript-кода. Puppeteer подходит для веб-скрапинга, работы с AJAX и SPA-приложениями, а также для быстрого выполнения тестов на Chrome. Его headless-режим и прямое взаимодействие с DevTools Protocol делают его отличным выбором для проектов, ориентированных на эти браузеры.

Комментарии:

0 комментариев