dom-testing-library: getByLabelText doesn't concat multipart aria-labelledby
React Testing Libraryversion: 9.5.0nodeversion: 12.4.0npm(oryarn) version: 6.13.6
What you did:
Along the lines of this MDN article, I have an input labelled by a combination of three different elements: a label, a text field, and another label. So the input has an aria-labelledby attribute with a value like label1 text-field label2. In my test, I’m trying to grab the input based on that full, concatenated label, with something like getByLabelText('text of label1 value of text-field text of label2').
What happened:
I can successfully grab the input with getByLabelText('text of label1') or getByLabelText('text of label2'), but giving it the full, concatenated label getByLabelText('text of label1 value of text-field text of label2') results in nothing being found. Even if I removed the text field ID from aria-labelledby, I still can’t get the input using getByLabelText('text of label1 text of label2').
Reproduction:
Here’s a codesandbox: https://codesandbox.io/s/rtl-aria-labelledby-multipart-vpjpx?from-embed=&file=/src/__tests__/index.js
Problem description:
Based on my understanding of the MDN article, the “label” for an input with a multiple IDs in aria-labelledby should be a concatenation of the values of the elements with those IDs. So I expected getByLabelText to retrieve the input based on this concatenated label (especially because it can handle aria-labelledby attributes with just one ID).
Suggested solution:
From looking at label-text.js, it seems like there are a couple things going on…
getByLabelTextonly looks at<label>elements, so that<input>that’s part of myaria-labelledbydoesn’t get picked up at all. (However, even when I removed the input’s ID fromaria-labelledby, I still had the concatenation problem, so this is kind of a separate issue.)getByLabelTextdoes a sweep for individual<label>elements matching the given text (before trying to figure out what input elements they’re labeling). This means it doesn’t catch combinations of<label>elements (or any other kind of element) that match the given text when concatenated.
So on the surface, fixing my problem would require significantly switching around how getByLabelText works so that it 1) looks at elements beyond <label>s and 2) considers combinations of element values.
However, the documentation explicitly says getByLabelText first looks for labels and then associated elements, and it also says something semi-cryptic about how you should use getByRole if you want to be “robust against switching to aria-label or aria-labelledby”. So I’m not sure if my “problem” is actually just the intended behavior.
If it is the intended behavior, then it would be great to clarify that in the documentation (and I’d be happy to submit a pull request for that!).
(I should also clarify that I’m happily using getByRole('checkbox', {name: 'allow up to 0 words in between'}) for my specific use case right now per this Stack Overflow post. I just wanted to submit this issue in case this is a bug that should be fixed!)
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Comments: 18 (17 by maintainers)
Commits related to this issue
- fix: getByLabelText ignores input labels (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- fix: getByLabelText does not get multiple concatenated labels(#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- fix: getByLabelText add concat type to matches(#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- add input node as label (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- create an helper function to retrieve all the labels (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- get concat label through labels combination (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- remove useless comment and refactor function (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- make queryAllByLabelText looks before for labelled elements and then check their label value (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- fix wrong splice usage (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- remove useless code (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- improve test coverage (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- retrieve elements with labels together the ones with aria-labelledby instead of looking for label elements (#545) — committed to delca85/dom-testing-library by deleted user 4 years ago
- fix(ByLabelText): get by label concat values (#681) Closes #545 — committed to harsha509/dom-testing-library by delca85 4 years ago
Sounds fine to me 👍
🎉 This issue has been resolved in version 7.21.2 🎉
The release is available on:
npm package (@latest dist-tag)Your semantic-release bot 📦🚀
I would recommend this as well.
getByLabelTextis really only a more performant escape hatch for simple labels. It’s doesn’t cover many valid labelling techniques and might even be misleading in worst case scenarios. It’s sufficient for testing if performance is an issue. For complex scenariosgetByRolewithnameshould be preferred.Thank you @delca85! I’ll give it a look as soon as I can.
@delca85, I was referring to @sheesania, but that’s great 📚
(Not sure whether you’ll see this because you’re not active on twitter, but I tweeted about this @sheesania 😃 https://twitter.com/kentcdodds/status/1268571672405086209)
Hi! @kentcdodds @sheesania If it’s ok for you I could give it a shot!
I’d be happy to give it a go at some point, but I’m not sure when I’ll have time to allocate to it. So if someone else wants to tackle it sooner, that’s just fine.