FB2 в Markdown: конвертация с сохранением заголовков
- Автоматизированные тесты покрывают 80% критических сценариев заказов за 2–3 дня разработки.
- Selenium WebDriver с Chrome Headless позволяет запускать тесты в CI за 30–40 секунд на сценарий.
- Тесты регистрации и логина выявляют до 60% багов, связанных с неправильными ответами сервера на некорректные данные.
- Assert на статус ответа и появление элементов сокращает время отладки в 3–5 раз по сравнению с ручным тестированием.
- Использование моков для платежного шлюза исключает ложные списания при тестировании оплаты.
- Окружение: что установить и как настроить
- Тест регистрации: проверка успешной и неуспешной отправки
- Тест входа: корректные и некорректные креды
- Тест оформления заказа: от корзины до подтверждения
- Сравнение инструментов: Selenium vs Playwright vs Cypress
- Как отлаживать: логи, скриншоты и скринкасты
- Базовый скрипт запуска всех тестов
- Edge cases: капча, 2FA, медленные ответы
- Интеграция с CI/CD: GitLab CI, GitHub Actions
Окружение: что установить и как настроить
Для запуска тестов нужны Python 3.10+, Selenium 4.x и ChromeDriver, совместимый с версией Chrome. Установка через pip:
pip install selenium==4.15.0 webdriver-manager==4.0.0webdriver-manager автоматически загружает актуальный ChromeDriver, избавляя от ручного поиска. В CI используйте Headless-режим:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)Убедитесь, что версия Chrome на сервере — 2026 года: 126+.
Тест регистрации: проверка успешной и неуспешной отправки
Напишем функцию для регистрации нового пользователя. Проверяем два сценария: корректные данные (200 / редирект) и уже существующий email (ошибка).
import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
BASE_URL = 'https://example.com'
def register_user(driver, email, password):
driver.get(f'{BASE_URL}/register')
driver.find_element(By.NAME, 'email').send_keys(email)
driver.find_element(By.NAME, 'password').send_keys(password)
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
def test_successful_registration(driver):
email = f'test_{int(time.time())}@example.com'
register_user(driver, email, 'Pass123!')
WebDriverWait(driver, 10).until(EC.url_contains('/account'))
assert 'Account' in driver.title
def test_duplicate_email(driver):
email = 'existing@example.com'
register_user(driver, email, 'Pass123!')
wait = WebDriverWait(driver, 10)
error = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'error')))
assert 'already registered' in error.text.lower()Используйте time.time() для генерации уникального email, чтобы избежать коллизий при повторных прогонах.
Тест входа: корректные и некорректные креды
Проверяем логин с верным паролем (ожидаем вход) и с неверным (ожидаем ошибку).
def test_login_success(driver):
driver.get(f'{BASE_URL}/login')
driver.find_element(By.NAME, 'email').send_keys('valid@example.com')
driver.find_element(By.NAME, 'password').send_keys('ValidPass1')
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
WebDriverWait(driver, 10).until(EC.url_contains('/dashboard'))
def test_login_wrong_password(driver):
driver.get(f'{BASE_URL}/login')
driver.find_element(By.NAME, 'email').send_keys('valid@example.com')
driver.find_element(By.NAME, 'password').send_keys('WrongPass')
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
error = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'error')))
assert 'invalid' in error.text.lower()Важно проверять не только наличие ошибки, но и её текст. Так вы отловите случай, когда сервер возвращает 200, но внутри JSON с ошибкой.
Тест оформления заказа: от корзины до подтверждения
Критический сценарий: добавление товара в корзину, заполнение формы доставки, имитация оплаты. Используем мок для платежного шлюза, чтобы не проводить реальную транзакцию.
def test_checkout(driver):
# предполагается, что пользователь уже залогинен
driver.get(f'{BASE_URL}/cart')
driver.find_element(By.CSS_SELECTOR, '.checkout-btn').click()
# заполнение адреса
driver.find_element(By.NAME, 'address').send_keys('ул. Ленина, 1')
driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
# переход на страницу оплаты
# используем мок-кнопку для симуляции успешного платежа
driver.find_element(By.ID, 'mock-pay-ok').click()
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'order-confirmed')))
assert 'Order #' in driver.page_sourceЕсли в проекте нет мока — создайте скрытый чекбокс в админке, который переключает платёжный шлюз в тестовый режим. На 2026 год это стандартная практика.
- 1Установить зависимости
pip install selenium webdriver-manager и драйвер браузера
- 2Написать фикстуру driver
Создать WebDriver с Headless-опциями и скриншотом при ошибке
- 3Реализовать сценарий заказа
Добавить товар, заполнить адрес, имитировать оплату
- 4Добавить assertion
Проверить появление confirmation ID или заголовка страницы
- 5Запустить локально
pytest -v tests/test_checkout.py
- 6Интегрировать в CI
Добавить stage в .gitlab-ci.yml или GitHub Actions
Сравнение инструментов: Selenium vs Playwright vs Cypress
| Инструмент | Язык | Скорость | Кросс-браузерность |
|---|---|---|---|
| Selenium | Python, Java, JS | Средняя | Chrome, Firefox, Safari |
| Playwright | Python, JS, Java | Быстрее | Chrome, Firefox, Safari, Edge |
| Cypress | JS | Очень быстрая | Chrome, Electron |
Для e‑commerce с большой командой выбирайте Selenium или Playwright — они покрывают реальные браузеры. Cypress быстрее, но не умеет работать с несколькими вкладками и ограничен в имитации пользовательских сценариев.
✅ Чеклист для первого релиза автотестов e‑commerce
0 из 10
Как отлаживать: логи, скриншоты и скринкасты
Когда тест упал, нужно понять почему. Добавьте в фикстуру сохранение скриншота при ошибке:
@pytest.fixture
def driver():
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
yield driver
if hasattr(driver, 'screenshot'):
driver.save_screenshot('failure.png')
driver.quit()Для анализа динамики настройте логирование HTTP-запросов через driver.logs (только Chrome). Это поможет увидеть 500-е ошибки на скрытых XHR.
Не забывайте про WebDriverWait: ожидание элемента по умолчанию должно быть 10 секунд, но для медленных страниц — увеличьте до 20.
Базовый скрипт запуска всех тестов
import pytest
import sys
if __name__ == '__main__':
exit_code = pytest.main(['-v', '--tb=short', '--maxfail=1', 'tests/'])
sys.exit(exit_code)Флаг --tb=short сокращает трейсбек — достаточно для быстрого понимания. --maxfail=1 останавливает прогон после первой ошибки в CI, экономя время.
Edge cases: капча, 2FA, медленные ответы
- Капча: отключайте в тестовом окружении через переменную окружения
DISABLE_CAPTCHA=True. Если нельзя — используйте библиотеку распознавания, но точность низкая. - 2FA: генерируйте одноразовый код на основе секрета через
pyotp. - Медленные ответы: используйте retry с экспоненциальной задержкой или увеличьте timeout до 30 секунд.
Интеграция с CI/CD: GitLab CI, GitHub Actions
Добавьте в .gitlab-ci.yml (или .github/workflows) stage с тестами:
test:
stage: test
image: python:3.10
script:
- pip install -r requirements.txt
- python -m pytest tests/ --headless --html=report.html
artifacts:
reports:
html: report.htmlНа 13 июля 2026 года Chrome Headless стабильно работает в Docker. Убедитесь, что образ содержит Chrome:
install:
- apt-get update && apt-get install -y chromium🧮 Посчитайте сами — инструменты по теме
🧭 Разделы по теме
Частые вопросы
Какой инструмент лучше для тестирования e‑commerce на Python?
Selenium — самый гибкий и поддерживает Python, Java и JS. Playwright быстрее, но требует меньше кода. Для коммерческих проектов с большим количеством сценариев выбирайте Selenium.
Как обрабатывать капчу в автотестах?
Лучший способ — отключить капчу в тестовом окружении через переменную окружения или конфиг. Если отключить нельзя, используйте библиотеки распознавания (например, Tesseract), но точность низкая — лучше добавить ручной ввод.
Как тестировать оплату без реального списания?
Создайте мок-сервер для платёжного шлюза или используйте тестовые карты (например, 4242 4242 4242 4242 в Stripe). В админке добавьте переключатель тестового режима.
Что делать, если тест падает из-за медленной загрузки страницы?
Увеличьте таймаут в WebDriverWait до 20–30 секунд. Используйте ожидание конкретного элемента, а не time.sleep(). В CI увеличьте лимит времени stage.
Как обновлять ChromeDriver для каждого релиза браузера?
Используйте webdriver-manager — он автоматически загружает совместимую версию. Не забудьте обновлять его в CI: pip install --upgrade webdriver-manager.
Нужно ли запускать тесты на реальном браузере или можно Headless?
Headless быстрее и дешевле для CI. Но перед релизом запустите smoke-тесты на реальном браузере, чтобы проверить отображение UI (например, в Selenium Grid).
Как генерировать уникальные email для регистрации?
Используйте time.time() или uuid.uuid4() в комбинации с доменом. Пример: f'test_{int(time.time())}@example.com'. Это гарантирует уникальность при каждом прогоне.
Как протестировать сценарий восстановления пароля?
Откройте страницу восстановления, введите email проверьте, что письмо отправлено (мок SMTP). Затем извлеките ссылку из базы данных (если доступно) или используйте сервис временных почтовых ящиков.
Источники и нормативные документы
- Selenium Documentation
- WebDriver Manager for Python
- Pytest Documentation