DEV Community

Samoilenko Yuri for RNDSOFT

Posted on • Originally published at blog.rnds.pro on

Selenium. Как заставить браузер работать на вас

Всем привет! Сегодня я расскажу, что такое 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'
Enter fullscreen mode Exit fullscreen mode

И устанавливаем гемы:

bundle install
Enter fullscreen mode Exit fullscreen mode

Работа с 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

Enter fullscreen mode Exit fullscreen mode

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

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

products = Selenium::WebDriver::Wait.new(timeout: 5).until do
  driver.find_elements(class: 'product-item')
end
Enter fullscreen mode Exit fullscreen mode

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

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)
Enter fullscreen mode Exit fullscreen mode

Небольшое пояснение к опциям:

  • --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

Enter fullscreen mode Exit fullscreen mode

И еще пара советов:

  • В браузер можно подгружать плагины:
options.add_extension(Rails.root.join('plugin.crx'))
Enter fullscreen mode Exit fullscreen mode
  • Обязательно надо закрывать за собой браузер, чтобы избегать утечек памяти:
driver.quit
Enter fullscreen mode Exit fullscreen mode
  • Иногда требуется работа с cookie. В этом помогут следующие команды:
driver.manage.all_cookies # получить все куки
driver.manage.cookie_named # получить куку по названию
driver.manage.add_cookie # записать куку
Enter fullscreen mode Exit fullscreen mode

Альтернативы Selenium

Самые популярные инструменты для работы с виртуальными браузерами это:

  • Selenium. Старейший представитель. Поддержка множества браузеров и библиотек на различных языках. Большое и активное сообщество. Более сложное api, чем у остальных.
  • Puppeteer. Работает только на Node.js. Поддержка Chrome и Firefox. Сообщество растет, но меньше по сравнению с Selenium. Простое и интуитивно понятное api.
  • Playwright. Самый молодой представитель в этом списке. Поддержка множества браузеров и есть библиотеки на различных языках. Удобное и современное api. Встроенная поддержка мобильных устройств. Сообщество активно развивается.

Вывод

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

Долговечность и стабильность подтверждают его надежность и эффективность.

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

Таким образом, Selenium остается одним из лучших инструментов для автоматизации браузеров. Используем его у себя в работе и вам советуем 🙂

Top comments (0)