-
Notifications
You must be signed in to change notification settings - Fork 470
getByLabelText doesn't concat multipart aria-labelledby #545
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Huh! That's very interesting. I'd never considered that use case before but it makes sense. Our general recommendation is to use |
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. |
Hi! @kentcdodds @sheesania If it's ok for you I could give it a shot! |
Sounds fine to me 👍 |
I need a clarification: would be the desired |
Hi @delca85, I'm not 100% certain I understand what you're asking, but maybe this will help: https://cpdth.csb.app/ (codesandbox) Here's what the accessibility tab says about this element: Based on this, I should be able to select that checkbox with the query: screen.getByLabelText('allow up to 0 words in between') I believe that will not work right now, and that's what we should fix. Does that help? |
Hi @kentcdodds ! Thanks a lot for your explaination. I got that point, but maybe my question was not right anyway. |
(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) |
yes I can see it, I am not an active writer but I am a really active reader! :) |
@delca85, I was referring to @sheesania, but that's great 📚 |
Hey @kentcdodds ! |
Can you help me understand why the |
If I got the point rightly, the concatenated labels are not retrieved by queryAllLabelsByText because of the matcher used. I hope I explained myself. |
I think I understand. If you could go ahead and push the code you have now (even if it's not finished yet) then it may help a bit. I was thinking about it and this is a lot more difficult than I initially assumed so I'm interested in what you have 😀 |
I have pushed my code. I am really doubtful about it, like I wrote in the pr but I would be glad if you share your ideas with me. |
Thank you @delca85! I'll give it a look as soon as I can. |
I would recommend this as well. |
…check their label value (testing-library#545)
…instead of looking for label elements (testing-library#545)
🎉 This issue has been resolved in version 7.21.2 🎉 The release is available on:
Your semantic-release bot 📦🚀 |
React Testing Library
version: 9.5.0node
version: 12.4.0npm
(oryarn
) version: 6.13.6What 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 likelabel1 text-field label2
. In my test, I'm trying to grab the input based on that full, concatenated label, with something likegetByLabelText('text of label1 value of text-field text of label2')
.What happened:
I can successfully grab the input with
getByLabelText('text of label1')
orgetByLabelText('text of label2')
, but giving it the full, concatenated labelgetByLabelText('text of label1 value of text-field text of label2')
results in nothing being found. Even if I removed the text field ID fromaria-labelledby
, I still can't get the input usinggetByLabelText('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 expectedgetByLabelText
to retrieve the input based on this concatenated label (especially because it can handlearia-labelledby
attributes with just one ID).Suggested solution:
From looking at label-text.js, it seems like there are a couple things going on...
getByLabelText
only looks at<label>
elements, so that<input>
that's part of myaria-labelledby
doesn'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.)getByLabelText
does 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 usegetByRole
if you want to be "robust against switching toaria-label
oraria-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!)The text was updated successfully, but these errors were encountered: