Skip to main content

Handle Shadow DOM

Elements inside a web component's shadow root aren't reachable with ordinary CSS from the page. BasePage gives you helpers that pierce the shadow boundary for you — no hand-written JavaScript.

SettingsPage.java
import com.seleniumboot.test.BasePage;
import org.openqa.selenium.By;

public class SettingsPage extends BasePage {

public void updateEmail(String email) {
// Host element <my-form>, then a selector scoped to its shadow root:
shadowType(By.cssSelector("my-form"), "#email", email);
shadowClick(By.cssSelector("my-form"), "#save");
}

public String bannerText() {
return shadowGetText(By.cssSelector("my-banner"), ".message");
}
}

Nested shadow roots (a component inside a component) — traverse them with shadowPierce(...), passing the host selector at each level:

// <checkout-flow> → shadow → <payment-widget> → shadow → #pay-btn
WebElement payBtn = shadowPierce("checkout-flow", "payment-widget", "#pay-btn");
payBtn.click();

Guard optional shadow content without a try/catchshadowExists(...) never throws:

if (shadowExists(By.cssSelector("my-form"), ".error")) {
// handle validation error
}
CSS only

Shadow-root selectors must be CSS — XPath cannot cross a shadow boundary.

Deeper reference: BasePage — page-object base class and its Shadow DOM helpers.