Как работает WebDriver

«Как работает WebDriver» — вопрос из категории Selenium и Selenide, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

WebDriver — это основа большинства фреймворков для автоматизации браузеров, включая Selenium WebDriver и Selenide. Я использую его для написания end-to-end тестов, которые имитируют действия реального пользователя.

Архитектура "Клиент-Сервер":

  1. Клиент (Test Script): Мой тестовый код на Java (например, с Selenide).
  2. Драйвер браузера (Browser Driver): Исполняемый файл (например, chromedriver.exe для Chrome), который запускается как отдельный серверный процесс.
  3. Браузер (Browser): Реальный браузер (Chrome, Firefox), которым управляет драйвер.

Поток команд: Тестовый код (Java) -> HTTP-запрос (JSON Wire Protocol/W3C WebDriver) -> Драйвер браузера -> Нативные команды браузера

Практический пример со Selenide (упрощённая обёртка над WebDriver):

import com.codeborne.selenide.*;
import static com.codeborne.selenide.Selenide.*;

public class LoginTest {
    @Test
    public void userCanLogin() {
        // 1. Открыть браузер и перейти на URL (Selenide автоматически управляет WebDriver)
        open("https://example.com/login");

        // 2. Найти элемент по CSS-селектору и ввести текст
        // Внутри Selenide отправляет команду findElement и sendKeys через WebDriver
        $(By.id("username")).setValue("testuser");
        $(By.name("password")).setValue("secret");

        // 3. Найти кнопку и кликнуть
        $(By.xpath("//button[@type='submit']")).click();

        // 4. Проверить результат (Selenide добавляет умные ожидания)
        $(".welcome-message").shouldHave(text("Welcome, testuser!"));
    }
}
// Selenide автоматически закрывает браузер после теста.

Что делает WebDriver "под капотом" в этом примере:

  • open() создаёт экземпляр WebDriver (например, ChromeDriver) и выполняет driver.get(url).
  • $(selector) транслируется в driver.findElement(selector).
  • .setValue() вызывает element.sendKeys(text).
  • .click() вызывает element.click().
  • .shouldHave() реализует явное ожидание (WebDriverWait), постоянно опрашивая DOM, пока условие не выполнится.

Ключевые особенности для тестировщика:

  • Реальный браузер: Тесты выполняются в реальной среде, что повышает достоверность.
  • Кроссплатформенность: Один и тот же тест может запускаться на разных ОС и браузерах.
  • Явные и неявные ожидания: Критически важны для стабильности тестов, так как WebDriver работает быстрее, чем загружается страница.
  • Ограничения: Не может автоматизировать CAPTCHA, сложную графику или действия вне вкладки браузера.