Access shadow DOM elements
Interact with elements inside shadow root
Form elements encapsulated in shadow DOM
Shadow root inside another shadow root
How to interact with Shadow DOM
Playwright: page.locator('#shadow-host').locator('#shadow-button') โ Playwright pierces shadow DOM automatically. The older >> piercing operator still works but is no longer required.
page.locator('#shadow-host').locator('#shadow-button')
>>
Cypress: Enable shadow-DOM mode per call โ cy.get('#shadow-host').shadow().find('#shadow-button'). Or globally via Cypress.config('includeShadowDom', true).
cy.get('#shadow-host').shadow().find('#shadow-button')
Cypress.config('includeShadowDom', true)
Selenide (Java): $("#shadow-host").shadowRoot().$("#shadow-button").click() โ fluent API for nested roots.
$("#shadow-host").shadowRoot().$("#shadow-button").click()
WebdriverIO: $('#shadow-host').shadow$('#shadow-button') for single element, shadow$$ for lists.
$('#shadow-host').shadow$('#shadow-button')
shadow$$
Common pitfalls
mode: 'closed'
.shadow().shadow()