Найти элемент по идентификатору в реагирующей-тестирующей библиотеке
Я использую реагирующее-тестирование-библиотекарь, чтобы проверить мое реагирующее приложение. По какой-то причине мне нужно найти элемент по id
и не data-testid
, Нет способа достичь этого в документации.
Есть ли способ добиться этого?
Я сделал вывод как:
const dom = render(<App />);
Я ищу что-то в строке:
const input = dom.getElemenById('firstinput');
//or
const input = dom.getById('firstinput');
7 ответов
Мне кажется, что ни один из ответов не дал полного решения, поэтому вот оно:
const result = render(<SomeComponent />);
const someElement = result.container.querySelector('#some-id');
Я нашел способ сделать это.
import App from './App';
import { render, queryByAttribute } from 'react-testing-library';
const getById = queryByAttribute.bind(null, 'id');
const dom = render(<App />);
const table = getById(dom.container, 'directory-table');
Надеюсь, это поможет.
Похоже, у вас есть сам DOM-узел в качестве контейнера. Поэтому вы должны быть в состоянии позвонить .querySelector('#firstinput')
с этим.
Есть два способа сделать это
- Просто использовать
container.getByElementId('id')
, В конце концов, все помощники делают такие запросы под капотом. - Если вы хотите иметь свой собственный запрос, вы можете написать собственный рендер. Проверьте документацию для получения дополнительной информации https://github.com/kentcdodds/react-testing-library
В заключение, если вы можете избежать поиска элементов по id, лучше.
В библиотеке тестирования
вы можете настроить
testIdAttribute
в комплектации.
configure({ testIdAttribute: 'id' })
https://testing-library.com/docs/dom-testing-library/api-configuration
Мой совет: прекратите добавлять и искать по идентификаторам, это всегда требует много времени и усилий, потому что вам нужно добавить идентификаторы (иногда тестовые идентификаторы), а затем найти лучший способ запросить элемент. Но даже если вам действительно нужен идентификатор, этот инструмент сэкономит вам много времени, показывая лучший способ запроса любого элемента DOM на вашем экране: Тестовая площадка
Если вы используете TypeScript и хотите получить не-
null
результат, вот удобная функция:
function getById<T extends Element>(container: HTMLElement, id: string): T {
const element = container.querySelector<T>(`#${id}`);
assert(element !== null, `Unable to find an element with ID #${id}.`)
return element;
}
Затем вы можете использовать его следующим образом:
import { render } from '@testing-library/react';
const { container } = render(<App />);
const myInputElement = getById<HTMLInputElement>(container, 'myInputElement');