Today I Learned

hashrocket A Hashrocket project

Access a shadowDOM node from Capybara

Using selenium_headless you can access a node from the shadowDOM using evaluate_script. The trick is knowing where in the showdowRoot.childNodes it’s going to be. If you have a web component called my-dope-component then you could do something like this:

shadow_host = find('my-dope-component')
shadow_child = evaluate_script('arguments[0].shadowRoot.childNodes[]', shadow_host)

The value for ` depends on the structure of the template that you're using, as well as the library (if any) that you're using. You could also write afindstyle script that iterates the children and locates the correct one based on thetagName` property or similar. For example: FIND_NODE = <<-SCRIPT Array.from(arguments[0].shadowRoot.childNodes).map(element => { if (element.tagName === arguments[1].toUpperCase()) return element; }).filter( value => value != undefined)[0] SCRIPT

Looking for help? Hashrocket has been an industry leader in Ruby on Rails since 2008. Rails is a core skill for each developer at Hashrocket, and we'd love to take a look at your project. Contact us and find out how we can help you.