Что нового в Selenium 4?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Отличный вопрос! Selenium 4 принес множество значимых улучшений, которые меняют подход к автоматизации веб-тестирования. Я выделю ключевые нововведения, которые должен знать каждый QA Automation инженер.
🔧 Ключевые архитектурные и протокольные изменения
Стандартизация на W3C WebDriver Protocol
Это фундаментальное изменение. Вместо устаревшего протокола JSON Wire Protocol Selenium 4 теперь использует стандартный W3C WebDriver протокол по умолчанию. Это обеспечивает:
- Большую стабильность и предсказуемость взаимодействия между клиентом (вашим кодом) и браузером.
- Совместимость между разными браузерами, так как все основные вендоры (Chrome, Firefox, Edge, Safari) следуют одному стандарту.
- Устранение множества "костылей" и несовместимостей из Selenium 3.
- Для старых драйверов, не поддерживающих W3C, Selenium 4 автоматически переключается на совместимый режим.
🚀 Новые возможности и API
1. Относительные локаторы (Relative Locators)
Мощное дополнение для поиска элементов относительно других элементов. Это альтернатива сложным XPath и помогает создавать более устойчивые селекторы.
// Пример на Java
import static org.openqa.selenium.support.locators.RelativeLocator.with;
WebElement passwordField = driver.findElement(By.id("password"));
// Найти поле ввода ВЫШЕ поля password
WebElement emailField = driver.findElement(with(By.tagName("input")).above(passwordField));
Доступны 5 позиций: above(), below(), toLeftOf(), toRightOf(), near() (в радиусе ~50px).
2. Новый объект ChromiumDriver и DevTools Protocol
Вместо прямого использования ChromeDriver можно работать через общий интерфейс ChromiumDriver (для Chrome и Edge). Главное — прямая интеграция с Chrome DevTools Protocol (CDP), что открывает возможности, недоступные ранее:
// Пример: Перехват сетевых запросов и извлечение данных
DevTools devTools = ((ChromiumDriver) driver).getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
// Добавление слушателя на все ответы
devTools.addListener(Network.responseReceived(),
response -> {
if(response.getResponse().getUrl().contains("/api/data")) {
System.out.println("Response Status: " + response.getResponse().getStatus());
System.out.println("Response Body: " + devTools.send(Network.getResponseBody(response.getRequestId())).getBody());
}
});
С помощью CDP можно:
- Эмулировать геолокацию, время, ориентацию устройства.
- Эмулировать сетевые условия (оффлайн, медленное соединение).
- Перехватывать и модифицировать сетевые запросы/ответы.
- Выполнять JavaScript на уровне отладчика (например, для мониторинга производительности).
3. Улучшенное управление окнами и вкладками
- Новые методы
driver.getWindowHandle()иdriver.getWindowHandles()возвращаютWindowType.WINDOWилиWindowType.TAB. - Простое создание новой вкладки или окна:
driver.switchTo().newWindow(WindowType.TAB);. - Улучшенная совместимость при переключении контекстов.
4. Новые методы для ожиданий (Waits)
Появились методы, не требующие явного указания времени ожидания (FluentWait остается, но эти методы удобнее для частых задач):
// Ждать загрузки страницы полностью (событие `document.readyState` == "complete")
driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(10));
// Selenium 4 предоставляет более удобные ожидания через ExpectedConditions
WebElement element = driver.findElement(By.id("dynamic"));
// Ожидание, что элемент станет видимым (уже есть в Selenium 3, но улучшено)
new WebDriverWait(driver, Duration.ofSeconds(5)).until(ExpectedConditions.visibilityOf(element));
📊 Улучшенный Selenium Grid
Selenium Grid 4 (полный редизайн)
Полностью переписан на основе Docker-ориентированной, модульной архитектуры. Основные компоненты:
- Router (
selenium/router): Маршрутизирует запросы. - Distributor (
selenium/distributor): Управляет узлами (Nodes). - Session Map (
selenium/sessions): Хранит информацию о сессиях. - Node (
selenium/node): Запускает браузеры. - Event Bus (
selenium/event-bus): Коммуникационная шина.
Преимущества новой Grid:
- Горизонтальная масштабируемость: Легко добавлять новые узлы.
- Отказоустойчивость: Компоненты независимы.
- Поддержка Docker: Официальные образы упрощают развертывание.
- Мониторинг: Встроенные эндпоинты для мониторинга (/readyz, /livez, /metrics).
- Упрощенный запуск: Для локальной разработки теперь можно запустить всё одной командой:
java -jar selenium-server.jar standalone
🛠 Изменения в синтаксисе и важные замечания
Обновление синтаксиса управления окнами
Старый метод driver.manage().window().setPosition() и setSize() объединены в один метод setRect():
// Selenium 3
driver.manage().window().setPosition(new Point(10, 10));
driver.manage().window().setSize(new Dimension(1024, 768));
// Selenium 4 (новый синтаксис)
driver.manage().window().setRect(new Rectangle(10, 10, 1024, 768));
Устаревание и удаление устаревших API
Были удалены устаревшие методы, такие как DesiredCapabilities (вместо них используются Options классы: ChromeOptions, FirefoxOptions и т.д.).
// Selenium 3 (устарело)
DesiredCapabilities caps = DesiredCapabilities.chrome();
// Selenium 4 (рекомендуемый подход)
ChromeOptions options = new ChromeOptions();
options.addArguments("--start-maximized");
options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"});
WebDriver driver = new ChromeDriver(options);
💡 Практические рекомендации для перехода
- Обновите зависимости в
pom.xml(Maven) илиbuild.gradle(Gradle) до версии4.x. - Замените
DesiredCapabilitiesна соответствующие классы*Options. - Протестируйте относительные локаторы там, где XPath/CSS слишком сложны.
- Изучите возможности CDP для сложных сценариев (сеть, производительность, эмуляция).
- Для Selenium Grid планируйте переход на новую архитектуру — она требует пересмотра процесса развертывания, но дает больше гибкости.
- Будьте готовы к изменениям в синтаксисе некоторых методов (особенно связанных с размером/позицией окон).
Итог: Selenium 4 — это не просто обновление версии, а серьезный эволюционный шаг. Он делает фреймворк более стабильным (благодаря W3C), мощным (через интеграцию с DevTools) и масштабируемым (новая Grid-архитектура). Хотя переход с Selenium 3 в большинстве случаев не требует полного переписывания тестов, инвестиции в изучение и внедрение новых возможностей окупаются повышением надежности и расширением спектра автоматизируемых сценариев.