I have a button with the attribute of aria-label="Sign In". I'm trying to select it with document.querySelector('button[aria-label=Sign In]') but that returns Uncaught DOMException: Document.querySelector: 'button[aria-label=Sign In]' is not a valid selector. Please help!
            Asked
            
        
        
            Active
            
        
            Viewed 888 times
        
    1
            
            
        
        ajarrow
        
- 414
 - 2
 - 10
 
- 
                    2Try with button[aria-label="Sign In"], you need to wrap it in – Mar 23 '21 at 21:58
 - 
                    You were a Google search away from [your answer](https://stackoverflow.com/q/2694640/383904).... – Roko C. Buljan Mar 23 '21 at 22:02
 - 
                    @RokoC.Buljan I tried Googling it but it didn't bring anything up because I was searching for select attribute with spaces – ajarrow Mar 23 '21 at 22:04
 - 
                    @ajarrow Google is against you if you complicate the search query ;) I googled for: *"js select elements by attribute page:stackoverflow"* and bam. First result on top. – Roko C. Buljan Mar 23 '21 at 22:06
 
2 Answers
3
            When you have a space in an attribute selector you must enclose it in quotes otherwise it is treated as a descendant selector.
Reference: https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors/Attribute_selectors
let b = document.querySelector('button[aria-label="Sign In"]');
console.log(b)
<button aria-label="Sign In">Hi Sign In!</button>
        Mark Schultheiss
        
- 32,614
 - 12
 - 69
 - 100
 
- 
                    https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector additional information on selectors here – Mark Schultheiss Mar 23 '21 at 22:07
 - 
                    Duplicate of https://stackoverflow.com/q/2694640/383904 of cumulative 1000+ votes – Roko C. Buljan Mar 23 '21 at 22:08
 - 
                    @RokoC.Buljan Similar yes but not specific to the cause and the descendent selector that resulted and why. – Mark Schultheiss Mar 23 '21 at 22:14
 - 
                    1PS, button should always have a `type` attribute. Just for the sake of muscle memory. `type="button"` since by default it's `type="submit"` – Roko C. Buljan Mar 23 '21 at 22:16
 - 
                    Yep I see lots of input and button without a type, and in this case it might be a submit button based purely on the OP code so I left it without, but good call out there @RokoC.Buljan – Mark Schultheiss Mar 23 '21 at 22:22
 - 
                    It's... debatable whether it's actually treated as a descendant combinator in that context but it is a syntax error all the same. Namely, browsers that support case-sensitivity flags *don't* treat it as one, but will still throw because the token `In` isn't a valid case-sensitivity flag. As for browsers that don't, who knows? Maybe they treat it as a descendant combinator, maybe they treat it as whitespace and throw on the `In` because they were expecting a `]` instead. – BoltClock Mar 24 '21 at 01:46
 
1
            
            
        use single or double quotes :
document.querySelector('button[aria-label="Sign In"]')
document.querySelector("button[aria-label='Sign In']")
OR escape the quotes if you same quotes for enclosing and representation :
document.querySelector("button[aria-label=\"Sign In\"]")
document.querySelector('button[aria-label=\'Sign In\']')
or use literal:
document.querySelector(`button[aria-label='Sign In']`)
You can use any of the approach
        PDHide
        
- 18,113
 - 2
 - 31
 - 46
 
- 
                    I tried single quotes but that doesn't work unless you have double quotes outside of that. Thanks! – ajarrow Mar 23 '21 at 22:01
 - 
                    you have to escape quotes if you use single , see the full available option @ajarrow – PDHide Mar 23 '21 at 22:10