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