intermediate

Avoiding brittle selectors

Предпочитайте user-facing roles, labels и explicit test contracts вместо implementation selectors, которые меняются при harmless refactors.

Хрупкие селекторы ломаются при безобидном рефакторинге: хеши CSS modules, nth-child, глубокие DOM-пути, runtime ID. Предпочитайте доступные имена — role, label, placeholder — и `data-testid` как явный контракт dev/QA, когда семантики мало.

В Playwright `getByRole('button', { name: 'Save' })` переживает смену разметки при том же UX.

На интервью: перепишите хрупкий XPath/CSS в запросы Testing Library и разницу в поддержке.

Типовые ошибки: test id на каждом div; текст, меняющийся с i18n; привязка к внутренностям виджетов.

Компромисс — чуть больше работы над a11y upfront против резкого снижения churn E2E.

Чеклист:

  • Приоритет: role, label, text, затем test id.
  • test id только для несемантических целей.
  • Без селекторов, завязанных на layout.