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 остается одним из лучших инструментов для автоматизации браузеров. Используем его у себя в работе и вам советуем 🙂

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more