← Назад к вопросам
Каким способом будешь находить локатор какого-нибудь элемента?
2.2 Middle🔥 151 комментариев
#Selenium и UI автоматизация#Фреймворки тестирования
Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Поиск и выбор локаторов элементов в автоматизации тестирования
Как опытный QA Automation Engineer, я подхожу к поиску локаторов системно и с приоритетом надежности. Мой процесс включает несколько этапов и стратегий, которые минимизируют хрупкость автотестов.
Основная стратегия выбора: приоритет типов локаторов
Я всегда стремлюсь использовать локаторы в следующем порядке предпочтения (от наиболее надежных к наименее):
- ID — уникальный идентификатор, самый стабильный и быстрый.
- Name — часто используется для форм и также достаточно устойчив.
- CSS Selector — мощный, гибкий и обычно быстрее XPath в современных браузерах.
- XPath — максимальная гибкость, но может быть хрупким и медленнее.
- Class Name, Tag Name, Link Text — используются, когда другие варианты недоступны или для конкретных задач (например, поиск по тексту ссылки).
Процесс поиска и анализа локатора на практике
Когда мне нужно найти локатор для элемента, я действую по следующему алгоритму:
- Визуальный осмотр в DevTools: Открываю инструменты разработчика браузера (F12), нахожу элемент с помощью Inspector, анализирую его HTML. Смотрю на наличие атрибутов
id,name,data-testidили других уникальныхdata-*атрибутов. - Проверка уникальности: Найдя потенциальный атрибут (например,
id="submitBtn"), проверяю его уникальность на всей странице через поиск в DevTools (Ctrl+F в Elements tab). Локатор должен находить ровно один элемент. - Выбор устойчивого атрибута: Отдаю предпочтение атрибутам, которые с меньшей вероятностью изменятся при рефакторинге фронтенда. Идеальны специальные атрибуты для тестирования, например
data-qaилиdata-testid, которые команда фронтенда добавляет по договоренности. - Построение CSS Selector: Если нет уникальных атрибутов, строю CSS Selector, комбинируя классы, атрибуты и иерархию. Стараюсь избегать излишней вложенности.
/* Плохо: хрупкий и перегруженный */ div.container > div.row > div.col-md-6 > form > button.btn-primary /* Лучше: используем уникальный класс или атрибут */ button.submit-button button[type='submit'][data-action='save'] - Использование XPath как крайняя мера: Прибегаю к XPath, когда CSS не справляется, например, для поиска по тексту или сложной иерархии. Избегаю абсолютных путей (
/html/body/div...) и использую относительные, с упором на уникальные атрибуты.// Относительный путь с атрибутом - хорошо //button[@id='loginBtn'] // Поиск по тексту (если текст стабилен) - осторожно //*[text()='Сохранить'] // Использование contains для частичного совпадения //button[contains(@class, 'primary')]
Инструменты и расширения для помощи
Для ускорения процесса я использую:
- SelectorsHub, ChroPath — плагины для браузера, которые предлагают и проверяют локаторы (CSS и XPath).
- Встроенный Console браузера — для быстрой проверки работоспособности локатора прямо на странице:
// Проверка CSS Selector document.querySelectorAll("button.submit-button").length // Проверка XPath (в Chrome) $x("//button[@data-qa='submit']")
Критерии "хорошего" локатора
Мой итоговый выбор всегда должен соответствовать критериям:
- Уникальность — находит один и только один элемент.
- Устойчивость — не зависит от изменений в структуре DOM, не связанных с этим элементом.
- Читаемость — понятен коллегам при ревью кода.
- Производительность — CSS обычно предпочтительнее XPath по скорости.
Пример полного цикла анализа
Допустим, мне нужно найти кнопку "Войти".
- В DevTools вижу:
<button class="btn auth-btn primary" data-testid="login-submit">Войти</button>. - Приоритет 1: Уникальный
data-testid="login-submit"— идеально! Проверяю в консоли:document.querySelectorAll('[data-testid="login-submit"]').length→ возвращает 1. Это лучший выбор. - Альтернатива: Если бы
data-testidотсутствовал, рассмотрел бы CSS по классам:button.auth-btn.primary. Проверил бы уникальность. - Крайний случай: Если бы классы были неуникальны, построил бы XPath, использующий текст как последний вариант:
//button[text()='Войти'], с оговоркой в комментарии к коду о потенциальной хрупкости.
В итоге, в Page Object я бы записал это так:
// Пример на Java + Selenium WebDriver с использованием стабильного data-testid
public class LoginPage {
private final WebDriver driver;
@FindBy(css = "[data-testid='login-submit']")
private WebElement loginButton;
public void clickLoginButton() {
loginButton.click();
}
}
Такой системный подход обеспечивает долгосрочную стабильность автотестов и снижает затраты на их поддержку.