Всем привет! Сегодня я расскажу, что такое Selenium, как его запустить, зачем он нужен, и какие у него есть плюсы и минусы.
Небольшая вводная
Selenium — это инструмент для автоматизации веб-браузеров. Он позволяет разработчикам и тестировщикам писать скрипты, которые могут управлять браузером, имитируя действия пользователя, такие как клики, ввод текста и навигация по страницам.
Selenium поддерживает множество языков программирования, включая Python, Java, Ruby и другие, и может работать с различными браузерам. Это делает его популярным выбором для автоматизации тестирования веб-приложений и выполнения рутинных задач в браузере.
Задачи, решаемые Selenium
Можно разделить на 2 большие группы. Это тестирование и парсинг (скрейпинг). Парсинг - это процесс извлечения и обработки данных из целевых ресурсов.
К тестированию можно отнести такие подгруппы как:
- Тестирование пользовательских интерфейсов. Позволяет проверять элементы интерфейса, такие как кнопки, поля ввода и ссылки, чтобы убедиться, что они работают, как задумано.
- Кросс-браузерное тестирование. Позволяет запускать тесты в различных браузерах, что помогает убедиться, что приложение работает корректно в разных средах.
- Регрессионное тестирование. Позволяет повторно запускать тесты после внесения изменений в код, чтобы убедиться, что новые изменения не нарушили существующий функционал.
В простых случаях можно обойтись и без Selenium. Например получать html страницы с помощью простых инструментов, таких как curl.
Но бывает более сложные случаи, когда Selenium становится нашим лучшим другом:
- Динамически загружаемые страницы. SPA приложению требуется js.
- Обход ограничений. Современные сайты часто содержат механизмы защиты от парсинга. Например, проверка cookie, user-agent и, конечно же, captcha.
Для обхода капчи часто используется комбинация Selenium, который позволяет выполнять js на странице и прогрузить капчу, и специального механизма для решения капчи. К таким механизмам относятся:
- _ Сторонние платные сервисы. Принимают изображение или аудиофайл через API и возвращают готовое решение._
- _ Обученные нейронные сети. Запускаются локально и самостоятельно распознают капчи._
После получения ответа от выбранного механизма Selenium используется для ввода решения в поле или для выполнения требуемых действий, например, выбора объектов вроде "светофоров" или “мостов”.
Конфигурирование приложения для работы с Selenium
Рассмотрим конфигурирование на примере Ruby on Rails приложения.
В первую очередь нам необходимо поставить гемы. Для этого добавляем в Gemfile следующие строки:
gem 'selenium-webdriver'
gem 'webdrivers'
И устанавливаем гемы:
bundle install
Работа с Selenium
Пример парсинга данных:
require 'selenium-webdriver'
require 'webdrivers'
driver = Selenium::WebDriver.for :chrome
driver.navigate.to 'http://example.com/products'
products = driver.find_elements(class: 'product-item')
products.each do |product|
name = product.find_element(class: 'product-name').text
price = product.find_element(class: 'product-price').text
Rails.logger.info { "Название: #{name}, Цена: #{price}" }
end
driver.quit
Функционально пример выше найдет названия и цену товаров на воображаемом сайте и напечатает их в логах. Но этот код можно улучшить.
Во-первых, нужно учитывать то, что Selenium - это браузер, а значит нам стоит ждать загрузки страницы. Поэтому модифицируем код, и при попытке получить список товаров, ждем 5 секунд и только потом падаем с ошибкой.
products = Selenium::WebDriver::Wait.new(timeout: 5).until do
driver.find_elements(class: 'product-item')
end
Во-вторых, нужно хоть немного замаскироваться от систем сайта, которые ограничивают работу парсеров. Для этого добавим немного “человечности” нашему браузеру.
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36')
options.add_argument('--headless=new')
options.add_argument('--disable-gpu')
options.add_argument('window-size=1200x800')
driver = Selenium::WebDriver.for(:chrome, options: options)
Небольшое пояснение к опциям:
- --disable-blink-features=AutomationControlled. Отключает некоторые функции Blink, которые указывают на то, что браузер управляется автоматизированным инструментом. Может помочь избежать обнаружения автоматизации на некоторых сайтах.
- --user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36. Устанавливает пользовательский агент (User-Agent) для браузера. Пользовательский агент сообщает веб-сайтам, какую версию браузера и операционной системы использует пользователь. Установка пользовательского агента может помочь в обходе блокировок или в получении контента, оптимизированного для определенного браузера.
- --headless=new. Запускает браузер в "безголовом" режиме, что означает, что он будет работать без графического интерфейса. Нужно для автоматизации и тестирования.
- --disable-gpu. Отключает использование графического процессора (GPU). Полезно в безголовом режиме, так как некоторые функции, зависящие от GPU, могут вызывать проблемы или не поддерживаться.
По итогу получится такой код:
require 'selenium-webdriver'
require 'webdrivers'
def wait(time)
Selenium::WebDriver::Wait.new(timeout: time)
end
def parse
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36')
options.add_argument('--headless=new')
options.add_argument('--disable-gpu')
driver = Selenium::WebDriver.for(:chrome, options: options)
driver.navigate.to 'https://example.com/products'
products = wait(5).until { driver.find_elements(class: 'product-item') }
products.each do |product|
name = product.find_element(class: 'product-name').text
price = product.find_element(class: 'product-price').text
Rails.logger.info { "Название: #{name}, Цена: #{price}" }
end
rescue Selenium::WebDriver::Error::TimeoutError
'Элемент с классом product-name не найден'
ensure
driver.quit
end
И еще пара советов:
- В браузер можно подгружать плагины:
options.add_extension(Rails.root.join('plugin.crx'))
- Обязательно надо закрывать за собой браузер, чтобы избегать утечек памяти:
driver.quit
- Иногда требуется работа с cookie. В этом помогут следующие команды:
driver.manage.all_cookies # получить все куки
driver.manage.cookie_named # получить куку по названию
driver.manage.add_cookie # записать куку
Альтернативы Selenium
Самые популярные инструменты для работы с виртуальными браузерами это:
- Selenium. Старейший представитель. Поддержка множества браузеров и библиотек на различных языках. Большое и активное сообщество. Более сложное api, чем у остальных.
- Puppeteer. Работает только на Node.js. Поддержка Chrome и Firefox. Сообщество растет, но меньше по сравнению с Selenium. Простое и интуитивно понятное api.
- Playwright. Самый молодой представитель в этом списке. Поддержка множества браузеров и есть библиотеки на различных языках. Удобное и современное api. Встроенная поддержка мобильных устройств. Сообщество активно развивается.
Вывод
Selenium является одним из самых популярных инструментов для автоматизации браузеров и тестирования веб-приложений. Широкая поддержка различных браузеров и языков программирования упрощает процесс написания кода для реализации задач, будь то тестирование или парсинг.
Долговечность и стабильность подтверждают его надежность и эффективность.
С большой вероятностью проблема, которую вы пытаетесь решить, уже кем-то была решена, и в интернете можно найти гайд, который поможет.
Таким образом, Selenium остается одним из лучших инструментов для автоматизации браузеров. Используем его у себя в работе и вам советуем 🙂
Top comments (0)