Найти элемент по идентификатору в react-testing-library

Я использую react-testing-libarary для тестирования своего приложения реакции. По какой-то причине мне нужно найти элемент по id, а не по data-testid. В документации нет способа добиться этого.

Есть ли способ добиться этого?

Я получил визуализированный результат как:

const dom = render(<App />);

Я ищу что-то вроде:

const input = dom.getElemenById('firstinput');
//or 
const input = dom.getById('firstinput');

person aks    schedule 26.10.2018    source источник
comment
У меня это сработало: document.getElementById('firstinput')   -  person James Gentes    schedule 18.03.2021


Ответы (6)


Мне кажется, что ни один из ответов на самом деле не дал полного решения, поэтому вот оно:

const result = render(<SomeComponent />);
const someElement = result.container.querySelector('#some-id');
person Liran H    schedule 12.11.2020
comment
Самый простой и ясный ответ, которому я могу следовать. - person Michael Durrant; 01.01.2021
comment
Это настоящий ответ. Нам нужно подтолкнуть это вверх. - person ajpieri; 08.01.2021
comment
у меня не сработало. но когда я зарегистрировался result.debug(), я ясно вижу элемент с этим идентификатором. :( - person hashbytes; 07.04.2021

Я нашел способ сделать это.

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');

Надеюсь, это поможет.

person aks    schedule 26.10.2018
comment
Почему у них этого нет по умолчанию ?? Я не могу в это поверить. - person Victor; 19.05.2020
comment
Намного проще использовать document.getElementById. Но идентификатор элемента - это деталь реализации, и я не рекомендую его использовать. - person kentcdodds; 14.08.2020
comment
@Victor, поверьте. Пользователи не заполняют элементы по идентификатору, поэтому и тест не должен (по крайней мере, согласно философии библиотеки react-testing-library). Они заполняют их метками, поэтому вы должны находить свои элементы в тесте так же, как их найдут пользователи: по метке, тексту-заполнителю или чему-то еще. - person lmat - Reinstate Monica; 09.12.2020
comment
@Imat - Восстановите Монику, ну, я обсудил несколько сценариев, в которых решение #id может быть идеальным. Все зависит от сценариев. Простой пример: при использовании сторонней библиотеки (например, Kendo), которая строит свои элементы на основе предоставленного вами #id, вы можете создавать тесты, полагаясь на идентификатор для доступа к элементам. Использование #id будет поддерживать совместимость с новыми версиями сторонней библиотеки, а также не загрязняет наш код идентификаторами data-test-id. Я объяснил это более подробно прямо здесь: github. com / testing-library / react-testing-library / issues / - person Victor; 09.12.2020
comment
Продолжайте прокручивать, пока не ответит @Liran H. - person Alejandro Mar; 19.03.2021

Похоже, у вас есть сам узел DOM как контейнер. Следовательно, вы сможете позвонить .querySelector('#firstinput') с этим.

person Ali BARIN    schedule 26.10.2018
comment
да, это работает, но единственная проблема в том, что теперь я не могу использовать react-testing-library помощников на этом возвращаемом узле. - person aks; 26.10.2018
comment
Нет ничего плохого в том, чтобы не использовать помощников, если они вам не нужны - person Giorgio Polvara - Gpx; 26.10.2018
comment
Я не могу использовать помощники библиотеки response-testing-library на этом возвращенном узле. Это неверно. О каких помощниках ты говоришь? Все помощники имеют дело с обычными узлами DOM, поэтому не имеет значения, как вы его нашли. Но в любом случае поиск элемента по его идентификатору не входит в библиотеку, потому что это деталь реализации. Воспользуйтесь одним из встроенных запросов. - person kentcdodds; 14.08.2020
comment
Лиран Х. ответ лучше. Некоторые люди могут не понять, что вы имеете в виду. Привести такой полный пример, как его, лучше imo. - person ajpieri; 08.01.2021
comment
Это самый быстрый и простой способ добиться этого. Объятия - person Nkoro Joseph Ahamefula; 18.03.2021

Вы можете установить testIdAttribute в конфигурации.

configure({ testIdAttribute: 'id' })

https://testing-library.com/docs/dom-testing-library/api-configuration


У настройки есть свои плюсы и минусы. Преимущество этого в том, что вы можете установить идентификатор для нескольких целей. (Идентификатор теста, маркетинговая аналитика, менеджер тегов и т. Д.) Вам не нужно добавлять одновременно id и test-id. Это хорошо для лаконичности кода.

Но будьте осторожны, вы можете случайно установить один и тот же идентификатор для двух разных компонентов на одной странице. Не забудьте добавить индекс или идентификацию к идентификатору компонента для элементов списка.

person Norman Lin    schedule 08.10.2020
comment
testIdAttribute: атрибут, используемый getByTestId и связанными запросами. По умолчанию data-testid. - person Norman Lin; 08.10.2020
comment
Это плохая идея, потому что идентификаторы должны быть уникальными для одного элемента на всей странице, тогда как тестовый идентификатор может использоваться более чем для одного элемента (например, элементов списка). - person Lokua; 21.01.2021
comment
Да, наверное, ты прав. Но есть некоторые преимущества для настройки, если нам нужны идентификаторы для нескольких целей. (например, менеджер тегов) - person Norman Lin; 26.01.2021

Есть два способа сделать это

  1. Просто используйте container.getElementById('id'). В конце концов, все помощники делают запросы, подобные этому, под капотом.
  2. Если вы хотите иметь свой собственный запрос, вы можете написать собственный рендер. Дополнительную информацию см. В документации. https://github.com/kentcdodds/react-testing-library#getbytestidtext-textmatch-htmlelement.

В заключение, если вы можете избежать поиска элементов по идентификатору, это лучше.

person Giorgio Polvara - Gpx    schedule 26.10.2018
comment
Я не думаю, что у вас есть доступ к getElementById в контейнере. - person djsoteric; 17.03.2020
comment
Это правильный ответ. (Я автор библиотеки тестирования). - person kentcdodds; 14.08.2020
comment
Попытайтесь войти container, я думаю, это не то, что вы ищете - person Giorgio Polvara - Gpx; 30.08.2020
comment
@kentcdodds Я имею в виду, было бы неплохо, если бы это работало таким образом (с 1.), но все, что я получаю, это TS2339: Property 'getElementById' does not exist on type 'HTMLElement'. - person pbialy; 25.03.2021
comment
Та же ошибка, что и pbialy. -1 для @kentcdodds - person Mihai Zamfir; 25.04.2021
comment
getElementById даже не присутствует в документах RTL '-' Для меня правильный способ использования этого инструмента: chrome.google.com/webstore/detail/testing-playground/ Я никогда больше не тратил время на добавление / поиск идентификаторов. - person Lucas Andrade; 25.05.2021
comment
getElementById отсутствует в документации, потому что это не API RTL, это API DOM, поддерживаемый всеми браузерами. Ошибка @pbialy и @ mihai-zamfir является ошибкой TypeScript и не имеет ничего общего с RTL. - person Giorgio Polvara - Gpx; 25.05.2021

Мой совет: прекратите добавлять и искать по идентификаторам, это всегда требует много времени и усилий, потому что вам нужно добавить идентификаторы (иногда тестовые идентификаторы), а затем найти лучший способ запросить элемент. Но даже если вам действительно нужен идентификатор, этот инструмент сэкономит вам много времени, показывая лучший способ запроса любого элемента DOM на вашем экране: Площадка для тестирования

person Lucas Andrade    schedule 25.05.2021