Хрупкие локаторы (Fragile Locators)
Локаторы элементов завязаны на автогенерированные атрибуты, позицию в DOM или визуальные CSS-классы фреймворка — всё, что меняется при любом рефакторинге вёрстки.
Симптомы
- Локаторы вида
//div[@id='ext-gen-1234']/span[3]/button[2] - Использование CSS-классов компонентных библиотек:
.MuiButton-containedPrimary,.v-btn--primary - XPath с жёсткой позицией:
//ul/li[2]/a -
idвидаember123,react-select-3-input— явно сгенерированные фреймворком
Причины возникновения
- Локаторы записаны «с ходу» через Inspector в DevTools без согласования с разработкой
- В команде нет соглашения об атрибутах для тестирования
- Front-end разработчики не знают, что QA опирается на конкретные атрибуты
- Используется запись действий (record & playback) в IDE или браузерных расширениях
Почему это проблема
- Тесты падают при каждом обновлении UI-библиотеки или рефакторинге вёрстки — даже если функциональность не изменилась
- Время на поддержку локаторов превышает время на написание новых тестов
- Команда теряет доверие к тестам: «тест красный — значит, снова локатор сломался»
- Настоящие баги маскируются шумом ложноотрицательных падений
Решение
Внедрить соглашение об атрибуте data-testid (или data-qa, data-cy) как контракт между разработкой и QA:
// ❌
@FindBy(xpath = "//div[@id='ext-gen-1234']/span[3]/button[2]")
private WebElement submitButton;
// ✅
@FindBy(css = "[data-testid='submit-btn']")
private WebElement submitButton;