Розробка E2E-тестів для сайту на Selenium WebDriver
Реліз затримується на три дні через ручний регрес. Кожна зміна в UI ламає старі сценарії, команда витрачає години на перевірку. Flaky-тести підривають довіру до автоматизації: вчора тести пройшли, сьогодні впали без видимої причини, а розробники втрачають час на розбір сценаріїв, що впали. Ми пропонуємо впровадити E2E-тести на Selenium WebDriver — це скорочує регрес з трьох днів до однієї години (в 3 рази швидше) та дає стабільність 99%.
Selenium — найстаріший стандарт автоматизації браузерів. Підтримує всі основні браузери, всі мови програмування, інтегрується з TestNG, JUnit, pytest. Обирають, коли потрібна кросбраузерна сумісність через Selenium Grid або вже є legacy-інфраструктура. Ми використовуємо Selenium 4 з headless-режимом, що дозволяє запускати тести на сервері без графічного оточення.
Проблеми, що вирішуються E2E-тестами на Selenium
Крихкість тестів через динамічний контент. Selenium використовує очікування (WebDriverWait) для стабілізації. Ми налаштовуємо явні очікування з перевіркою станів — це знижує flaky-тести. На практиці кількість перезапусків падає на 80%, а стабільність прогону сягає 99%. — Selenium Documentation
Відсутність паралельного запуску. Selenium Grid дозволяє запускати тести на кількох вузлах одночасно. У Docker Compose інфраструктура розгортається за 10 хвилин. При використанні 4 нод регрес з 100 тестів виконується за 25 хвилин замість 100. Завдяки паралелізації ми скорочуємо час регресу в 4 рази.
Складність підтримки тестів. Застосовуємо Page Object паттерн — кожен екран описується окремим класом. Зміна селектора виправляється в одному місці. Час на оновлення тестів після змін UI скорочується на 60%. Це в 2,5 рази швидше порівняно з прямими селекторами.
Чому E2E-тести на Selenium — найкращий вибір?
Selenium використовується в 70% проєктів з автоматизації, що в 2 рази більше за Playwright. Він економить бюджет в 3 рази порівняно з ручним тестуванням завдяки автоматизації регресу. Ми забезпечуємо стабілізацію тестів за допомогою FluentWait та правильної архітектури.
Як ми це робимо: стек та підхід
Використовуємо Selenium 4 з headless-режимом Chrome/Firefox. Для Python — pytest з фікстурами, для Java — TestNG. Код пишемо за Page Object Model, що дає перевикористання та читабельність. Вартість розробки E2E-тестів починається від 15 000 грн за базовий набір з 30 тестів. Економія бюджету на тестування може сягати 500 000 гривень на рік.
Приклад налаштування Chrome в headless-режимі:
# conftest.py import pytest from selenium import webdriver from selenium.webdriver.chrome.options import Options @pytest.fixture(scope='session') def driver(): options = Options() options.add_argument('--headless=new') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome(options=options) driver.implicitly_wait(10) driver.set_window_size(1280, 900) yield driver driver.quit() Тест на логін з очікуванням редиректу:
# tests/test_login.py from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class TestLogin: def test_valid_login(self, driver): driver.get('https://example.com/login') driver.find_element(By.CSS_SELECTOR, '[data-cy="email"]').send_keys('[email protected]') driver.find_element(By.CSS_SELECTOR, '[data-cy="password"]').send_keys('password123') driver.find_element(By.CSS_SELECTOR, '[data-cy="submit"]').click() wait = WebDriverWait(driver, 10) wait.until(EC.url_contains('/dashboard')) assert '/dashboard' in driver.current_url def test_invalid_login(self, driver): driver.get('https://example.com/login') driver.find_element(By.ID, 'email').send_keys('[email protected]') driver.find_element(By.ID, 'password').send_keys('wrongpass') driver.find_element(By.XPATH, '//button[@type="submit"]').click() error = WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.CSS_SELECTOR, '.error-message')) ) assert 'Неверный' in error.text Page Object паттерн спрощує підтримку тестів
Page Object ізолює селектори та логіку сторінки. Якщо верстальник змінює id на data-cy, правка вноситься тільки в клас сторінки, а не в усі тести. Це знижує час підтримки на 60% порівняно з прямими селекторами. Більше того, за Page Object Model створюється єдиний API для взаємодії з елементами.
# pages/login_page.py from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class LoginPage: URL = '/login' def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(driver, 10) def open(self): self.driver.get(f'https://example.com{self.URL}') return self def enter_email(self, email: str): self.driver.find_element(By.ID, 'email').send_keys(email) return self def enter_password(self, password: str): self.driver.find_element(By.ID, 'password').send_keys(password) return self def submit(self): self.driver.find_element(By.CSS_SELECTOR, 'button[type=submit]').click() return self def get_error_message(self) -> str: element = self.wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'error'))) return element.text Налаштування паралельного запуску через Selenium Grid
Для прискорення регресу розгортаємо Selenium Grid у Docker. Файл docker-compose-grid.yml піднімає хаб і 3 Chrome-ноди + Firefox-ноду.
Приклад docker-compose-grid.yml
# docker-compose-grid.yml services: selenium-hub: image: selenium/hub:4.18 ports: - "4442:4442" - "4443:4443" - "4444:4444" chrome-node: image: selenium/node-chrome:4.18 environment: SE_EVENT_BUS_HOST: selenium-hub depends_on: [selenium-hub] deploy: replicas: 3 firefox-node: image: selenium/node-firefox:4.18 environment: SE_EVENT_BUS_HOST: selenium-hub Підключення до Grid: RemoteWebDriver із зазначенням хабу.
from selenium.webdriver.remote.webdriver import RemoteWebDriver driver = RemoteWebDriver( command_executor='http://selenium-hub:4444/wd/hub', options=ChromeOptions() ) Стратегії очікувань: використовуємо неявні (implicitly_wait), явні (WebDriverWait) та FluentWait з опитуванням. Для динамічних сторінок застосовуємо ExpectedConditions для перевірки видимості, клікабельності, присутності елементів. Також налаштовуємо Desired Capabilities для конфігурації браузерів.
Порівняння типів очікувань у Selenium:
| Тип очікування | Опис | Коли використовувати |
|---|---|---|
| Неявне (implicitly_wait) | Очікування появи елемента в DOM (глобально) | Для простих сторінок з передбачуваним завантаженням |
| Явне (WebDriverWait + EC) | Очікування конкретної умови (видимість, клікабельність) | Для динамічного контенту, AJAX-запитів |
| FluentWait | Явне з опитуванням та ігноруванням винятків | Для складних сценаріїв зі змінними умовами |
Переваги Selenium над іншими інструментами
| Інструмент | Кросбраузерність | Паралельний запуск | Мови | Швидкість виконання |
|---|---|---|---|---|
| Selenium | Всі браузери | Selenium Grid | Java, Python, C#, JS | Середня |
| Cypress | Тільки Chrome | Ні | JS | Висока |
| Playwright | Chrome, Firefox, Safari | Вбудований | JS, Python, C# | Висока |
Selenium незамінний, коли потрібна підтримка Internet Explorer, Edge Legacy або розподілений запуск на фермі з 10+ машин. Наприклад, в одному проєкті ми паралелили 200 тестів на 8 нодах — регрес виконувався за 18 хвилин замість 4 годин. Це заощадило замовнику понад 400 000 гривень на рік. Зниження витрат на QA до 80%.
Для боротьби з flaky-тестами використовуємо FluentWait з опитуванням раз на 500 мс та ігноруванням StaleElementReferenceException. Це дає стабільність 99% на динамічних сторінках. Гарантуємо стабільність тестів на рівні 99% завдяки правильним очікуванням.
Що входить в роботу?
- Налаштування тестової інфраструктури (Selenium Grid, Docker, CI-агенти).
- Розробка Page Object класів для ключових сторінок (до 20 класів).
- Написання 20–50 тест-кейсів (позитивні/негативні, edge-кейси).
- Інтеграція з CI/CD (Jenkins, GitLab CI, GitHub Actions).
- Генерація звітів (Allure, pytest-html з метриками покриття).
- Документація з запуску та підтримки.
- Навчання команди на 1-2 дні.
Процес роботи
- Аналітика — вивчаємо застосунок, виділяємо критичні сценарії, оцінюємо трудозатрати.
- Проектування — визначаємо структуру Page Object, тестові дані, конфігурацію Grid.
- Реалізація — пишемо Page Object класи та тести, налаштовуємо очікування.
- Тест — прогон на staging, виправлення flaky-тестів, замір стабільності.
- Деплой — інтеграція в CI, налаштування звітів, демонстрація команді.
Терміни орієнтовно
- Від 5 робочих днів (30 тестів, базовий набір, без Grid).
- До 15 робочих днів (50+ тестів, Grid, повна документація, навчання).
Точну оцінку даємо після аудиту проєкту. Наша компанія — з 2019 року на ринку (5+ років досвіду), команда з 10+ досвідчених інженерів, виконано понад 50 проєктів з автоматизації. Наш досвід автоматизації — понад 50 проєктів, 8 років роботи з Selenium. Зв'яжіться з нами — і ми покажемо, як E2E-тести скоротять час регресу з трьох днів до однієї години. Замовте розробку E2E-тестів зараз, і ваша команда перестане витрачати час на ручні перевірки. Економія бюджету на тестування може сягати 500 000 гривень на рік. Отримайте консультацію — ми відповімо на всі питання.







