Зачем тестировщикам знания о frontend
Вам не нужно становиться frontend-разработчиком. Но вам нужно говорить на этом языке достаточно хорошо, чтобы вести продуктивные разговоры с разработчиками, писать точные баг-репорты и понимать, что вы тестируете.
Когда тестировщик говорит «кнопка не на своём месте», разработчику приходится гадать, что происходит. Когда тестировщик говорит «у кнопки submit стоит margin-top: 0 вместо margin-top: 16px, из-за чего она перекрывает поле формы на экранах уже 768px», разработчик может исправить это за секунды.
Этот урок научит вас минимальным знаниям frontend, которые дадут максимальную пользу для тестирования.
HTML: Структура
HTML (HyperText Markup Language) определяет структуру и содержимое веб-страницы. Думайте о нём как о скелете страницы.
Основные HTML-элементы для тестирования
<!-- Заголовки определяют структуру документа -->
<h1>Главный заголовок</h1>
<h2>Заголовок раздела</h2>
<!-- Параграфы и текст -->
<p>Это параграф текста.</p>
<span>Строчный текстовый элемент</span>
<!-- Ссылки -->
<a href="https://example.com" target="_blank">Нажмите здесь</a>
<!-- Изображения -->
<img src="photo.jpg" alt="Описание изображения">
<!-- Формы -->
<form action="/submit" method="POST">
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<button type="submit">Отправить</button>
</form>
<!-- Списки -->
<ul>
<li>Неупорядоченный элемент</li>
</ul>
<ol>
<li>Упорядоченный элемент</li>
</ol>
<!-- Контейнеры -->
<div class="wrapper">Блочный контейнер</div>
<section>Семантическая секция</section>
<nav>Область навигации</nav>
<footer>Область подвала</footer>
Что тестировщики должны проверять в HTML
Семантическая корректность: Используются ли заголовки в правильном порядке (h1, затем h2, без прыжков к h4)? Это влияет на доступность и SEO.
Атрибуты форм: Есть ли у каждого input элемент label? Установлены ли атрибуты required на обязательных полях? Используется ли правильный type (email, number, tel)?
Целостность ссылок: Ведут ли атрибуты href на валидные URL? Есть ли у внешних ссылок target="_blank" с rel="noopener noreferrer" для безопасности?
Доступность изображений: Есть ли у каждого <img> осмысленный атрибут alt? Это не просто хорошая практика — это юридическое требование во многих юрисдикциях.
Data-атрибуты: Современные фреймворки используют data-testid или аналогичные атрибуты для автоматизации тестирования. Проверяйте, что они есть там, где нужно.
DOM: HTML в памяти
Когда браузер загружает HTML, он создаёт DOM (Document Object Model) — живую древовидную структуру в памяти. JavaScript может модифицировать DOM, поэтому страницы меняются без перезагрузки.
Понимание DOM важно, потому что:
- Исходный HTML-код и живой DOM могут отличаться (JavaScript его изменяет)
- Инструменты автоматизированного тестирования взаимодействуют с DOM, а не с исходным HTML
- «Просмотр исходного кода» показывает оригинальный HTML; вкладка Elements в DevTools показывает живой DOM
CSS: Представление
CSS (Cascading Style Sheets) контролирует, как выглядят HTML-элементы — цвета, размеры, позиции, анимации и адаптивное поведение.
Концепции CSS, которые должны знать тестировщики
Блочная модель (Box Model): Каждый элемент — это блок с content, padding, border и margin. Большинство багов вёрстки сводятся к неправильным значениям блочной модели.
+---------------------------+
| margin |
| +---------------------+ |
| | border | |
| | +-----------------+ | |
| | | padding | | |
| | | +-----------+ | | |
| | | | content | | | |
| | | +-----------+ | | |
| | +-----------------+ | |
| +---------------------+ |
+---------------------------+
Типы отображения: Элементы block занимают всю ширину, элементы inline текут вместе с текстом, flex и grid создают современные макеты.
Позиционирование: static (по умолчанию), relative, absolute, fixed, sticky — каждый тип меняет расположение элемента на странице.
Media queries: Правила, применяющие стили в зависимости от размера экрана. Так работает адаптивный дизайн.
/* Стили для экранов уже 768px */
@media (max-width: 768px) {
.sidebar { display: none; }
.main-content { width: 100%; }
}
Распространённые CSS-баги
| Баг | Симптом | Что проверять |
|---|---|---|
| Переполнение | Текст или изображения выходят за пределы контейнера | Свойство overflow, размеры контейнера |
| Z-index | Элементы скрыты за другими | Значения z-index, контекст наложения |
| Выравнивание | Элементы не центрированы или не выровнены | display: flex, text-align, margin: auto |
| Поломка адаптивности | Вёрстка ломается при определённой ширине | Media queries, мета-тег viewport |
| Рендеринг шрифтов | Текст выглядит по-разному в разных браузерах | Fallback-шрифты в font-family, загрузка веб-шрифтов |
JavaScript: Поведение
JavaScript делает веб-страницы интерактивными — обрабатывает клики, валидирует формы, получает данные, обновляет страницу без перезагрузки.
Концепции JavaScript для тестировщиков
Обработка событий: Когда пользователь нажимает на кнопку, JavaScript перехватывает событие и выполняет код. Баги возникают, когда обработчики событий отсутствуют, привязаны к неправильному элементу или срабатывают многократно.
Асинхронные операции: API-вызовы, таймеры и анимации — асинхронные, они не выполняются мгновенно. Многие баги возникают потому, что код выполняется до прихода данных.
// Это распространённый паттерн бага:
const data = fetchUserData(); // Возвращает Promise, а не данные
console.log(data.name); // Ошибка: data — это объект Promise
// Правильный подход:
const data = await fetchUserData(); // Ждёт данные
console.log(data.name); // Работает корректно
Управление состоянием: Современные фреймворки (React, Vue, Angular) управляют состоянием приложения. Когда состояние обновляется некорректно, UI показывает неправильную информацию — устаревшие данные, фантомные элементы или пропущенные обновления.
Использование консоли браузера
Консоль — ваша суперсила в тестировании. Откройте её нажатием F12 или Cmd+Option+J (Mac) / Ctrl+Shift+J (Windows).
Проверка ошибок: Красные сообщения в консоли означают ошибки JavaScript. Это баги, даже если страница выглядит нормально.
Запросы к элементам: Используйте document.querySelector('.button-class') для программного поиска элементов.
Мониторинг сети: Вызовы console.log из приложения раскрывают поток данных.
Тестирование взаимодействий: Вы можете выполнять JavaScript напрямую, чтобы запускать действия, менять значения или инспектировать состояние приложения.
// Найти все битые изображения на странице
document.querySelectorAll('img').forEach(img => {
if (!img.complete || img.naturalWidth === 0) {
console.log('Битое изображение:', img.src);
}
});
Практика: Инспекция реальной веб-страницы
Давайте отработаем навыки из этого урока на реальной веб-странице.
Упражнение 1: Инспекция HTML
Откройте любой веб-сайт и используйте DevTools (F12 > вкладка Elements):
- Кликните правой кнопкой мыши на главный заголовок и выберите «Исследовать элемент». Запишите HTML-тег (
h1,h2и т.д.) - Найдите форму на странице. Проверьте каждый input:
- Есть ли у него элемент
label? - Правильный ли атрибут
type(email, password, number)? - Установлены ли атрибуты
required,minlengthилиmaxlength?
- Есть ли у него элемент
- Найдите изображение. Проверьте, есть ли у него осмысленный атрибут
alt - Кликните правой кнопкой на ссылку. Проверьте, ведёт ли
hrefна валидный адрес
Задокументируйте каждую находку, как вы бы сделали в баг-репорте.
Упражнение 2: Исследование CSS
Используя ту же страницу:
- В DevTools выберите элемент и посмотрите на панель Styles справа
- Включайте/выключайте CSS-свойства, кликая на чекбокс рядом с каждым правилом
- Измените значение
marginилиpaddingи наблюдайте эффект - Измените размер окна браузера до разной ширины (1200px, 768px, 375px) и отметьте изменения вёрстки
- Поищите элементы, которые выходят за границы контейнеров или перекрывают другие элементы
Упражнение 3: Исследование консоли JavaScript
Откройте вкладку Console в DevTools:
- Введите
document.titleи нажмите Enter — это покажет заголовок страницы - Введите
document.querySelectorAll('a').length— это подсчитает все ссылки на странице - Введите
document.querySelectorAll('img[alt=""]').length— это подсчитает изображения с пустым атрибутом alt - Проверьте наличие ошибок в консоли (красные сообщения). Каждая ошибка — потенциальный баг
- Попробуйте эту проверку доступности:
// Найти интерактивные элементы без доступных имён
document.querySelectorAll('button, a, input').forEach(el => {
const name = el.textContent.trim() || el.getAttribute('aria-label') || el.getAttribute('alt') || '';
if (!name) console.warn('Нет доступного имени:', el.tagName, el.className);
});
Упражнение 4: Определение frontend-бага
Вот типичный сценарий. Пользователь сообщает: «Цена показывается как $NaN на странице товара».
Для расследования:
- Откройте консоль — ищите ошибки JavaScript
- Найдите элемент цены в DOM — каково его текстовое содержимое?
- Найдите в вкладке Network ответ API — содержит ли он валидные данные о цене?
- Проверьте, правильно ли JavaScript парсит цену (string vs. number)
Баг может быть:
- Backend: API возвращает цену как строку “19.99”, а frontend ожидает число
- Frontend: JavaScript использует
parseIntвместоparseFloat, теряя десятичные знаки - Данные: У товара нет цены в базе данных, возвращается
null
Ваше расследование определяет, кто должен исправить баг.
Профессиональные советы по тестированию frontend
Совет 1: Всегда проверяйте консоль. Даже если страница выглядит нормально, ошибки в консоли указывают на проблемы. Предупреждения о производительности, уведомления об устаревших API и неудачные сетевые запросы — всё отображается здесь.
Совет 2: Используйте эмуляцию устройств. В DevTools есть панель устройств (Ctrl+Shift+M), которая имитирует разные размеры экрана и устройства. Тестируйте на стандартных breakpoint: 320px, 375px, 768px, 1024px, 1440px.
Совет 3: Отключите JavaScript. В настройках DevTools можно отключить JavaScript для проверки поведения страницы без него. Отображается ли контент? Деградируют ли формы корректно? Это тестирует доступность и SEO.
Совет 4: Проверяйте загрузку шрифтов. На медленных соединениях может появляться вспышка нестилизованного текста (FOUT) или невидимого текста (FOIT) при загрузке пользовательских шрифтов. Тестируйте с включённым троттлингом сети.
Совет 5: Инспектируйте состояния hover и focus. В панели Elements DevTools используйте кнопку :hov для принудительной активации состояний hover, focus, active и visited. Проверяйте, что все интерактивные элементы имеют видимые индикаторы фокуса для клавиатурной навигации.
Ключевые выводы
- HTML определяет структуру — тестировщики должны проверять семантическую корректность, атрибуты форм и доступность
- CSS управляет представлением — распространённые баги связаны с переполнением, z-index, выравниванием и адаптивными breakpoint
- JavaScript добавляет интерактивность — следите за асинхронными ошибками, багами обработки событий и проблемами управления состоянием
- DOM — живое представление страницы, с которым взаимодействуют инструменты тестирования
- Консоль браузера показывает ошибки, невидимые пользователям, и необходима для эффективной отладки
- Вам не нужно писать production-код, но чтение и понимание frontend-кода делает вас значительно более эффективным тестировщиком