getByLabelText является одним из наиболее удобных и
семантически корректных методов поиска элементов в React Testing
Library, особенно при работе с формами. Он позволяет находить элементы
управления формой (input, textarea, SELECT) через связанный с ними
<label>, что делает тесты более читаемыми и
устойчивыми к изменениям разметки.
getByLabelText ищет элемент формы по тексту
метки, ассоциированной с этим элементом через атрибут
for у <label> или через вложенность:
<label htmlFor="username">Имя пользователя</label>
<input id="username" type="text" />
или
<label>
Пароль
<input type="password" />
</label>
В первом случае htmlFor связывает
<label> с <input> по
идентификатору. Во втором — <input> вложен в
<label>, что автоматически связывает их.
getByLabelText корректно обрабатывает оба варианта.
const element = screen.getByLabelText(text, options);
text – текст метки или регулярное выражение для поиска.
options – объект с дополнительными параметрами:
selector – CSS-селектор, чтобы уточнить тип элемента
(например, input, textarea).exact – булевое значение, указывающее точное совпадение
текста (true по умолчанию).collapseWhitespace – объединяет пробелы при сравнении
текста.trim – удаляет пробелы в начале и конце текста при
сравнении.Поиск текстового поля и ввод значения:
import { render, screen, fireEvent } FROM '@testing-library/react';
import LoginForm from './LoginForm';
render(<LoginForm />);
const usernameInput = screen.getByLabelText('Имя пользователя');
fireEvent.change(usernameInput, { target: { value: 'admin' } });
expect(usernameInput.value).toBe('admin');
Использование регулярного выражения для гибкого поиска:
const passwordInput = screen.getByLabelText(/парол/i);
fireEvent.change(passwordInput, { target: { value: 'secret' } });
expect(passwordInput.value).toBe('secret');
Фильтрация по типу элемента:
const textarea = screen.getByLabelText('Комментарий', { selector: 'textarea' });
fireEvent.change(textarea, { target: { value: 'Отличный пост!' } });
expect(textarea.value).toBe('Отличный пост!');
getByLabelTextСемантическая точность Поиск происходит через
<label>, что отражает взаимодействие пользователя с
формой, а не только структуру DOM.
Устойчивость к изменениям структуры Тесты не ломаются при перестановке элементов внутри формы, если метка остается прежней.
Поддержка различных типов форм Работает с
input, textarea, select, а также
с кастомными компонентами, поддерживающими aria-label или
aria-labelledby.
<label>Если элемент формы не имеет явной метки, можно использовать атрибуты ARIA:
<input aria-label="Email" type="email" />
Тогда getByLabelText все равно сможет его найти:
const emailInput = screen.getByLabelText('Email');
Несоответствие текста метки Пробелы, переносы
строк и регистр могут повлиять на поиск. В таких случаях стоит
использовать регулярные выражения или опцию
exact: false.
Несвязанный <label> Если
htmlFor указывает на неправильный id, элемент
не будет найден. Вложенность <input> в
<label> — надежная альтернатива.
Множественные совпадения Если на странице
несколько элементов с одинаковым текстом метки,
getByLabelText выбросит ошибку. Использование
getAllByLabelText позволит получить массив
элементов.
getByLabelText часто используется вместе с
fireEvent или библиотекой user-event для
имитации действий пользователя:
import userEvent from '@testing-library/user-event';
const commentInput = screen.getByLabelText('Комментарий');
userEvent.type(commentInput, 'Отличный пост!');
expect(commentInput.value).toBe('Отличный пост!');
Такой подход делает тесты максимально приближенными к реальному взаимодействию с формой.
<label> или использовать
aria-label.getByLabelText перед прямым использованием
getByRole или getByTestId для текстовых полей
и textarea.fireEvent или user-event
для симуляции ввода и событий формы.getByLabelText обеспечивает семантически корректные,
устойчивые и читаемые тесты, позволяя сосредоточиться на поведении
компонента, а не на деталях DOM.