Як працює Selenium WebDriver: клієнт, протокол, драйвер, браузер
Selenium WebDriver — це API для керування браузером так, як це робив би користувач: відкрити сторінку, знайти елемент, клікнути, ввести текст, прочитати результат. Тест (Java-код) не торкається браузера напряму, а проходить ланцюжок:
- клієнтська бібліотека (selenium-java) перетворює виклики
driver.get(...), element.click() на команди;
- протокол W3C WebDriver — стандарт, за яким команди передаються як HTTP-запити з JSON (запит і відповідь);
- драйвер браузера (chromedriver, geckodriver, msedgedriver) — окремий процес, який приймає ці HTTP-запити й керує браузером;
- браузер виконує дію й повертає результат у зворотному напрямку.
Усе це називається сесією: new ChromeDriver() створює сесію, driver.quit() завершує її, закриває вікна й зупиняє процес драйвера. close() закриває лише поточне вікно.
WebDriver driver = new ChromeDriver();
try {
driver.get("https://example.com");
String title = driver.getTitle();
} finally {
driver.quit();
}
Оскільки протокол стандартизований, один і той самий тест можна запускати на Chrome, Firefox, Edge чи Safari, змінивши лише клас драйвера або опції. Selenium 4 розмовляє лише W3C-діалектом: старий JSON Wire Protocol і Selenium RC — історія, а не варіанти.
Обмеження класичної моделі: вона запитання-відповідь. Браузер сам не може повідомити тесту «щойно з’явилась помилка в консолі» — для подій потрібен двосторонній протокол (WebDriver BiDi, окрема стаття).
Selenium Manager, опції браузера й RemoteWebDriver
Раніше драйвер скачували вручну й вказували шлях через System.setProperty("webdriver.chrome.driver", ...) або підтягували WebDriverManager. Тепер це робить Selenium Manager, вбудований у Selenium з версії 4.6:
- визначає версію встановленого браузера, підбирає й завантажує відповідний драйвер, кешує його (за замовчуванням
~/.cache/selenium);
- з 4.11 (Chrome), 4.12 (Firefox) і 4.14 (Edge) може сам завантажити й сам браузер, якщо його немає;
- налаштовується змінними середовища (
SE_CACHE_PATH, SE_OFFLINE) чи файлом se-config.toml; у Java кеш і offline не задаються через опції браузера.
Тому типовий код — просто new ChromeDriver(). Якщо в CI немає мережі, драйвер і браузер мають бути підготовлені заздалегідь (образ, кеш, явний шлях до драйвера); інакше сесія не створиться.
Опції браузера. У Selenium 4 налаштування передають класами ChromeOptions, FirefoxOptions, EdgeOptions; DesiredCapabilities як рекомендований спосіб — це спадщина Selenium 3.
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless=new", "--window-size=1920,1080");
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver = new ChromeDriver(options);
Корисні опції: розмір вікна (для headless він інакше малий і ламає адаптивну верстку), pageLoadStrategy (normal чекає повного завантаження, eager — DOMContentLoaded, none — не чекає), проксі, acceptInsecureCerts, профіль і налаштування завантаження файлів.
RemoteWebDriver підключається до віддаленого вузла (Selenium Grid, Docker-контейнер, хмарна платформа) за URL і тими самими опціями:
WebDriver driver = new RemoteWebDriver(URI.create("http://localhost:4444").toURL(), options);
Решта тесту не змінюється: це і є сенс спільного інтерфейсу WebDriver.