Открыть сервис

Selenium WebDriver

Selenium WebDriver — это программный интерфейс (API) для автоматизации действий в веб-браузерах, являющийся ключевым компонентом экосистемы Selenium. Он позволяет программам на различных языках программирования (Java, Python, C#, Ruby, JavaScript, Kotlin) управлять браузером, имитируя действия пользователя: переход по ссылкам, заполнение форм, нажатие кнопок, извлечение данных. В отличие от более раннего Selenium RC (Remote Control), WebDriver напрямую взаимодействует с браузером через его нативный движок, не используя посредника в виде JavaScript-прокси, что обеспечивает более высокую скорость и стабильность тестов.

История

Разработка Selenium началась в 2004 году в компании ThoughtWorks (США) как внутренний инструмент для тестирования веб-приложений. Первая версия, Selenium Core, работала исключительно в браузере, внедряя JavaScript-команды. В 2006 году появился Selenium Remote Control, который позволял запускать тесты на удалённых машинах, но требовал установки сервера и имел ограничения из-за политики безопасности браузеров.

В 2008 году инженер Google Саймон Стюарт (Simon Stewart) создал проект WebDriver, который решал фундаментальную проблему Selenium RC: он обращался к браузеру напрямую через его собственный API, минуя JavaScript-песочницу. В 2009 году проекты Selenium и WebDriver объединились, и Selenium 2.0 (выпущен в 2011 году) включил WebDriver как основную технологию. Selenium RC был объявлен устаревшим и удалён из версии 3.0 (2016 год). На момент написания статьи актуальной является версия Selenium 4 (выпущена в 2021 году), которая добавила поддержку протокола W3C WebDriver (стандарт W3C, принятый в 2018 году) и улучшенную работу с окнами, вкладками и относительными локаторами.

Архитектура и принцип работы

Selenium WebDriver работает по клиент-серверной модели, но в упрощённом виде — как библиотека, которая через сетевые протоколы связывается с драйвером конкретного браузера.

Компоненты системы

  1. Клиентская библиотека (Client Library) — код на языке программирования, который использует API WebDriver. Библиотека переводит команды (например, click(), sendKeys()) в HTTP-запросы к драйверу браузера.
  2. Драйвер браузера (Browser Driver) — исполняемый файл, поставляемый производителем браузера (ChromeDriver для Google Chrome, GeckoDriver для Mozilla Firefox, EdgeDriver для Microsoft Edge). Он принимает HTTP-запросы от клиентской библиотеки, преобразует их в команды нативного API браузера и возвращает результат.
  3. Браузер (Browser) — собственно программа для просмотра веб-страниц (Chrome, Firefox, Safari, Opera и др.).

Протокол взаимодействия

До версии 4 Selenium использовал протокол JSON Wire Protocol (собственный формат Selenium). Начиная с Selenium 3 и окончательно в Selenium 4, основным стал стандартизированный протокол W3C WebDriver (спецификация W3C). Это обеспечило единообразие команд для всех браузеров, поддерживающих стандарт. Запросы отправляются по HTTP на локальный адрес (обычно http://localhost:порт`), где драйвер слушает команды.

Жизненный цикл сессии

  1. Создание экземпляра драйвера: WebDriver driver = new ChromeDriver(); — запускает процесс драйвера и открывает новое окно браузера.
  2. Выполнение команд: навигация (get(), navigate()), поиск элементов (findElement(), findElements()), взаимодействие (click(), sendKeys()), получение данных (getText(), getAttribute()).
  3. Завершение сессии: driver.quit(); — закрывает все окна браузера и завершает процесс драйвера.

Возможности и функции

Навигация и управление браузером

  • Переход по URL: driver.get("https://example.com");`
  • Навигация вперёд/назад: driver.navigate().back(); / driver.navigate().forward();
  • Обновление страницы: driver.navigate().refresh();
  • Управление окнами и вкладками: открытие новой вкладки, переключение между окнами, получение дескрипторов окон (getWindowHandles(), switchTo().window()).
  • Управление куками: добавление, удаление, получение кук (manage().addCookie(), manage().deleteCookieNamed()).

Поиск элементов (локаторы)

WebDriver предоставляет несколько стратегий для поиска элементов на странице:

  • By.id("id_value") — по уникальному идентификатору (самый быстрый).
  • By.name("name_value") — по атрибуту name.
  • By.className("class_value") — по значению CSS-класса.
  • By.tagName("div") — по имени HTML-тега.
  • By.cssSelector("css_selector") — по CSS-селектору (гибкий и мощный).
  • By.xpath("xpath_expression") — по XPath-выражению (позволяет искать по тексту, структуре документа).
  • By.linkText("полный текст ссылки") — по точному тексту ссылки.
  • By.partialLinkText("часть текста") — по частичному тексту ссылки.

В Selenium 4 добавлены относительные локаторы (Relative Locators), позволяющие искать элементы относительно других: above(), below(), toLeftOf(), toRightOf(), near().

Взаимодействие с элементами

  • Клик: element.click();
  • Ввод текста: element.sendKeys("текст");
  • Очистка поля: element.clear();
  • Отправка формы: element.submit();
  • Получение атрибутов и свойств: element.getAttribute("href"), element.getCssValue("color"), element.getText().
  • Проверка состояния: isDisplayed(), isEnabled(), isSelected().

Ожидания (Waits)

Для синхронизации тестов с динамическим содержимым страниц WebDriver поддерживает два типа ожиданий:

  1. Неявные ожидания (Implicit Waits) — задаются один раз для экземпляра драйвера и применяются ко всем операциям поиска элементов. Если элемент не найден сразу, драйвер ждёт заданное время перед выбрасыванием исключения: driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
  2. Явные ожидания (Explicit Waits) — применяются к конкретному элементу или условию. Используют класс WebDriverWait и ожидаемые условия (ExpectedConditions): new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.visibilityOfElementLocated(By.id("result")));

Также существует Fluent Wait — более гибкая версия, позволяющая задавать частоту опроса и игнорировать определённые исключения.

Работа с фреймами и окнами

  • Переключение во фрейм: driver.switchTo().frame("frameName") или driver.switchTo().frame(index).
  • Возврат к основному документу: driver.switchTo().defaultContent();
  • Работа с всплывающими окнами (алертами): driver.switchTo().alert().accept(); (подтвердить), driver.switchTo().alert().dismiss(); (отклонить).

Скриншоты и выполнение JavaScript

  • Снятие скриншота: ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
  • Выполнение произвольного JavaScript: ((JavascriptExecutor) driver).executeScript("window.scrollBy(0, 500);");

Классификация и виды

Selenium WebDriver — это не единственный инструмент в экосистеме Selenium. Он входит в состав Selenium Suite, который включает:

  • Selenium IDE — плагин для браузера (Firefox, Chrome), позволяющий записывать и воспроизводить тесты без программирования.
  • Selenium WebDriver — основной компонент для написания автоматизированных тестов на языках программирования.
  • Selenium Grid — инструмент для параллельного запуска тестов на нескольких машинах и браузерах одновременно.

По способу развёртывания WebDriver может использоваться:

  • Локально — драйвер и браузер установлены на той же машине, где выполняется тест.
  • Удалённо — через RemoteWebDriver, который подключается к Selenium Grid или облачным сервисам (Sauce Labs, BrowserStack, LambdaTest).

Применение

Основная сфера применения Selenium WebDriver — автоматизированное тестирование веб-приложений. Он используется для:

  • Функционального тестирования — проверка корректности работы пользовательских сценариев (регистрация, оформление заказа, поиск).
  • Регрессионного тестирования — повторная проверка после внесения изменений в код.
  • Кросс-браузерного тестирования — запуск одних и тех же тестов в разных браузерах (Chrome, Firefox, Safari, Edge) для проверки совместимости.
  • Параллельного тестирования — с использованием Selenium Grid или облачных платформ для ускорения прогона.
  • Веб-скрапинга (парсинга) — автоматический сбор данных с веб-страниц, когда нет API. Однако для этой цели WebDriver менее эффективен, чем специализированные библиотеки (Beautiful Soup, Scrapy), из-за накладных расходов на запуск браузера.
  • Автоматизации рутинных операций — например, заполнение форм на порталах госуслуг или мониторинг цен.

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

Преимущества

  • Кроссплатформенность и мультиязычность — поддерживает все основные языки программирования и операционные системы (Windows, macOS, Linux).
  • Гибкость — возможность настройки браузера через опции (headless-режим, отключение изображений, настройка прокси).
  • Стандартизация — протокол W3C WebDriver обеспечивает единообразие между браузерами.
  • Активное сообщество — большое количество документации, примеров, библиотек-обёрток (например, Selenide для Java).
  • Интеграция с фреймворками — легко встраивается в TestNG, JUnit, pytest, NUnit, Mocha и системы CI/CD (Jenkins, GitLab CI, GitHub Actions).

Недостатки

  • Скорость — запуск полноценного браузера требует значительных ресурсов (память, процессор). Headless-режим быстрее, но медленнее, чем HTTP-запросы (например, в Playwright или Puppeteer).
  • Сложность работы с динамическим контентом — современные SPA-приложения (React, Angular, Vue.js) требуют грамотной настройки ожиданий, иначе тесты становятся нестабильными («flaky tests»).
  • Отсутствие встроенной поддержки некоторых сценариев — например, работа с HTTP-запросами, перехват сетевого трафика, эмуляция мобильных устройств (хотя частично решается через Chrome DevTools Protocol в Selenium 4).
  • Зависимость от версий браузеров — при обновлении браузера может потребоваться обновление драйвера (ChromeDriver, GeckoDriver).

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

На рынке автоматизации тестирования существуют аналоги Selenium WebDriver:

  • Playwright (Microsoft) — более современный инструмент с поддержкой нескольких браузеров, встроенным перехватом сетевых запросов, автоматическими ожиданиями и возможностью работы с мобильными устройствами.
  • Puppeteer (Google) — библиотека для управления Chrome/Chromium через DevTools Protocol, быстрее WebDriver, но ограничена одним браузером.
  • Cypress — фреймворк для тестирования фронтенда, работающий непосредственно в браузере, с упором на разработчиков и простоту отладки.
  • TestCafe — не требует драйверов, запускает тесты в браузере через прокси-сервер.

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

Источники

  • Официальная документация Selenium (selenium.dev)
  • «Selenium WebDriver: Practical Guide» by Boni Garcia
  • Спецификация W3C WebDriver (w3.org/TR/webdriver/)
  • Статьи на Habr, посвящённые автоматизации тестирования
  • Документация ChromeDriver и GeckoDriver

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →