Хрупкие локаторы (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;