← Теория

🖥 Блок 03 — Frontend-тестирование Ozon

Кроссбраузерность · DevTools · DOM · Локаторы · Page Object · WebDriver · Charles · Allure · Моки · Пуши

🌐 1. Кроссбраузерное тестирование

Кроссбраузерное тестирование — проверка, что сайт/приложение одинаково работает в разных браузерах и на разных устройствах.

Почему это нужно

Движки браузеров

ДвижокБраузерыОсобенности
BlinkChrome, Edge, Opera, BraveХромиум-семья, большинство рынка
WebKitSafariЧасто проблемы с датами, CSS-анимациями
GeckoFirefoxРедкие CSS-отличия, своя DevTools

Что проверять

АспектПримеры
ВёрсткаЭлементы не съезжают, шрифты отображаются, адаптивность
ФункциональностьКнопки кликаются, формы отправляются, модалки открываются
ПроизводительностьСтраница грузится быстро, нет тормозов при скролле
ResponsiveНа мобильном, планшете, десктопе — всё корректно

Инструменты

На собе: "Кроссбраузерное тестирование нужно, потому что разные браузеры используют разные движки рендеринга. Основные проблемы: Safari с CSS/датами, Firefox с редкими фичами, мобильные — touch вместо hover."

🔧 2. Chrome DevTools

DevTools (F12) — встроенный набор инструментов разработчика в браузере. Для QA — основной инструмент поиска багов.

Основные панели

ПанельЧто делаетКогда использовать QA
ElementsDOM-дерево + стили CSSПроверить вёрстку, найти элемент, посмотреть стили
ConsoleJS-ошибки и логиУвидеть ошибки при действии на странице
NetworkВсе HTTP-запросыПроверить какие API-запросы уходят, что возвращается, статусы
ApplicationStorage, Cookie, LocalStorageПроверить токены, куки, сохранённые данные
PerformanceПрофилирование скоростиНайти тормозящие места
LighthouseАудит: SEO, доступность, скоростьОбщая оценка качества страницы

Network — самая важная для QA

Console — ищем JS-ошибки

На собе: "Network — основная панель для QA. Там видно все запросы, их статусы, тела request/response. Console — для поиска JS-ошибок. Elements — для проверки DOM и стилей."

🌲 3. DOM

DOM (Document Object Model) — это дерево элементов HTML-страницы. Браузер создаёт DOM из HTML, и через него JS может менять страницу.

<html>
  <body>
    <div class="container">
      <h1>Заголовок</h1>
      <button id="btn">Кликни</button>
    </div>
  </body>
</html>

→ DOM-дерево:

html
└── body
    └── div.container
        ├── h1 → "Заголовок"
        └── button#btn → "Кликни"

Для QA важно

На собе: "DOM — дерево объектов HTML-страницы. Браузер строит его из HTML. Автотесты ищут элементы именно в DOM. Если элемент не в DOM — его нельзя найти через локаторы."

🎯 4. Локаторы

Локатор — способ найти элемент на странице для автотеста. Указывает: «найди мне кнопку с таким id/классом/текстом».

Типы локаторов (от лучших к худшим)

ПриоритетЛокаторПримерНадёжность
🥇data-testid[data-testid="login-btn"]⭐⭐⭐ Лучшая практика
🥈ID#login-btn⭐⭐⭐ Если уникальный
🥉CSSbutton.primary⭐⭐ Умеренная
🥉XPath//button[contains(text(),'Login')]⭐⭐ Мощный, но хрупкий
По тексту"Click me"⭐ Ломается при переводе

CSS vs XPath

CSS SelectorXPath
СинтаксисПростой, как в CSSСложнее, XML-путь
По тексту❌ Не умеет✅ Умеет (contains)
Вверх по дереву❌ Не умеет (только вниз)✅ Умеет (parent::)
СкоростьБыстрееМедленнее
Примерdiv.card > button.primary//div[@class='card']/button
На собе: "Лучший локатор — data-testid, потому что он не зависит от вёрстки и текста. XPath мощнее CSS (ищет по тексту, ходит вверх по дереву), но медленнее и хрупче. CSS — проще и быстрее."

📐 5. Page Object Model (POM)

Page Object — паттерн проектирования автотестов. Каждая страница приложения = отдельный класс, который описывает элементы и действия.

Зачем нужен

Пример

# login_page.py (Page Object)
class LoginPage:
  def __init__(self, driver):
    self.email_input = driver.find("#email")
    self.pass_input = driver.find("#password")
    self.login_btn = driver.find("#login-btn")

  def login(self, email, password):
    self.email_input.send_keys(email)
    self.pass_input.send_keys(password)
    self.login_btn.click()

# test_login.py (Тест)
def test_login():
  page = LoginPage(driver)
  page.login("test@mail.com", "123456")
  assert "Dashboard" in driver.title

Принципы POM

На собе: "Page Object — паттерн, где каждая страница = класс. Локаторы и действия описаны один раз. Если меняется UI — правишь одно место, а не все тесты."

🏎 6. WebDriver / Selenium / Playwright

WebDriver — протокол управления браузером. Позволяет программно: открыть страницу, кликнуть, ввести текст, сделать скриншот.

Selenium vs Playwright

SeleniumPlaywright
ВозрастСтарый, проверенныйСовременный (Microsoft)
СкоростьМедленнееБыстрее
ОжиданияЯвные/неявные waits (сложно)Auto-waiting (сам ждёт)
МультибраузерностьChrome, Firefox, Safari, EdgeChromium, Firefox, WebKit
МобильноеAppium (отдельно)Эмуляция устройств
APIW3C WebDriverCDP + собственный протокол

Что умеет WebDriver

Ожидания (Waits) — критически важно!

ТипЧто делаетИспользовать?
Implicit WaitГлобальный таймаут на все find_element⚠️ Осторожно — может маскировать проблемы
Explicit WaitЖдать конкретное условие (элемент кликабелен, видим)✅ Лучшая практика
sleep(5)Ждать 5 секунд всегда❌ Плохо — то слишком долго, то мало
На собе: "WebDriver — протокол управления браузером. Playwright современнее Selenium: auto-waiting, быстрее. Explicit Wait — лучшая практика для ожиданий, sleep — зло."

🔍 7. Charles Proxy

Charles — прокси-сервер, который стоит между клиентом и сервером и перехватывает весь трафик. Network в DevTools, но для любого приложения (включая мобильные).

Что умеет

ФункцияЧто делаетЗачем QA
СниффингПоказывает все запросы и ответыВидеть что реально уходит на сервер и что возвращается
RewriteПодмена ответов (mock!)Сервер вернул 200 → меняешь на 500, смотришь реакцию UI
ThrottlingЗамедление сети (3G, Edge)Тестировать при плохом интернете: таймауты, спиннеры, потери данных
BreakpointsОстановка запроса для ручного редактированияНа лету изменить тело запроса/ответа
Map LocalПодмена ответа локальным файломВместо реального ответа — твой JSON-файл
HTTPSРасшифровка HTTPS (нужен сертификат)Видеть зашифрованный трафик
На собе: "Charles — прокси для перехвата и анализа трафика. Для мобильного QA — замена DevTools. Умеет: сниффинг, подмена ответов (mock), throttling (эмуляция плохой сети)."

📦 8. Mock (заглушки)

Mock — подмена реального ответа/объекта на заранее заданный. Позволяет тестировать без зависимости от бэкенда.

Зачем моки

Где используются

ИнструментКакПример
CharlesRewrite / Map Local — подмена ответаМеняем 200 → 500
PostmanMock Server — отдельный сервер с заглушкамиСоздаёшь mock server для коллекции
Код (автотесты)Библиотеки: mock, nock, pytest-mockmock.when("/api/users").thenReturn({...})
На собе: "Mock — заглушка, подменяющая реальный ответ сервера. Нужен когда бэкенд не готов, или чтобы протестировать обработку ошибок без ломания прода. Charles — один из инструментов для мокирования."

📊 9. Allure (репортинг)

Allure — инструмент для визуальных отчётов по автотестам. Показывает результаты прогона в красивом веб-интерфейсе.

Что показывает

ФичаОписание
✅❌ РезультатыКакие тесты прошли, какие упали
📸 СкриншотыАвтоматический скриншот при падении
📝 ШагиStep-by-step: что делал каждый тест
📊 ТрендыГрафики: как меняется стабильность тестов со временем
🏷 КатегорииГруппировка: product bugs, auto bugs, infrastructure

Allure vs Qase

AllureQase
НазначениеОтчёты по автотестамУправление тест-кейсами (TMS)
Ручные тесты❌ Только авто✅ Ручные + авто
Скриншоты при падении✅ Автоматически⚠️ Надо прикреплять вручную
Где используетсяCI/CD пайплайн → отчёт после прогонаВедение тестовой документации
На собе: "Allure — инструмент для отчётности автотестов. Показывает результаты прогона, скриншоты при падении, шаги теста, тренды. В стеке Ozon: allure-go + allure testops."

📱 10. Push-уведомления

Push — уведомление, которое приходит на устройство от сервера через системный сервис.

Как работает

Backend → FCM (Android) / APNs (iOS) → Устройство → Уведомление

Что тестировать

ПроверкаЧто смотрим
ДоставкаПриходит ли пуш вообще
КонтентПравильный текст, иконка, звук
Тап на пушОткрывается ли нужный экран (deeplink)
Состояние приложенияОткрыто / в фоне / закрыто — разное поведение
ОффлайнПри появлении сети пуш должен прийти
ОтпискаЕсли юзер выключил пуши — не приходят
На собе: "Схема: сервер → FCM/APNs → устройство. Проверяем: приходит ли, правильный контент, поведение при тапе (deeplink), разное состояние приложения (открыто/фон/закрыто), оффлайн."

💬 Вопросы для самопроверки