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[<magic-index>]', shadow_host)
The value for <magic-index>
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 a find
style script that iterates the children and locates the correct one based on the tagName
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
Tweet