Home > Java > javaTutorial > How to Access Nested Shadow DOM Elements in Chrome Using Selenium?

How to Access Nested Shadow DOM Elements in Chrome Using Selenium?

Linda Hamilton
Release: 2024-12-30 02:29:18
Original
198 people have browsed it

How to Access Nested Shadow DOM Elements in Chrome Using Selenium?

Accessing Shadow DOM Elements: Interacting with #shadow-root (open) While Clearing Browsing Data in Chrome

Interfacing with #shadow-root elements, such as the "Clear data" button in Chrome's Clear browsing data popup, requires special handling within Selenium due to their encapsulation within shadow DOMs.

Problem Statement:

While using Selenium to automate Chrome's Clear browsing data popup, accessing the #shadow-root (open) element containing the "Clear data" button using cssSelector results in exceptions.

Solution:

Due to the nested nature of shadow DOMs in this context, accessing the target element necessitates traversing multiple shadow root levels. Employing a custom method, getShadowElement, allows for streamlined access to shadow tree elements:

public static WebElement getShadowElement(WebDriver driver, WebElement shadowHost, String cssOfShadowElement) {
    WebElement shardowRoot = getShadowRoot(driver, shadowHost);
    return shardowRoot.findElement(By.cssSelector(cssOfShadowElement));
}
Copy after login

By chaining multiple getShadowElement calls, you can progressively descend through shadow DOM levels:

// Locate shadowHost on the current dom
WebElement shadowHostL1 = driver.findElement(By.cssSelector("settings-ui"));

// now locate the shadowElement by traversing all shadow levels
WebElement shadowElementL1 = getShadowElement(driver, shadowHostL1, "settings-main");
WebElement shadowElementL2 = getShadowElement(driver, shadowElementL1,"settings-basic-page");
WebElement shadowElementL3 = getShadowElement(driver, shadowElementL2,"settings-section > settings-privacy-page");
WebElement shadowElementL4 = getShadowElement(driver, shadowElementL3,"settings-clear-browsing-data-dialog");
WebElement shadowElementL5 = getShadowElement(driver, shadowElementL4,"#clearBrowsingDataDialog");
WebElement clearData = shadowElementL5.findElement(By.cssSelector("#clearBrowsingDataConfirm"));
Copy after login

Alternatively, a single JavaScript call can encapsulate the traversal process:

WebElement clearData = (WebElement) js.executeScript("return document.querySelector('settings-ui').shadowRoot.querySelector('settings-main').shadowRoot.querySelector('settings-basic-page').shadowRoot.querySelector('settings-section > settings-privacy-page').shadowRoot.querySelector('settings-clear-browsing-data-dialog').shadowRoot.querySelector('#clearBrowsingDataDialog').querySelector('#clearBrowsingDataConfirm')");
Copy after login

This approach enables seamless interaction with #shadow-root (open) elements, including the "Clear data" button, regardless of their nested shadow DOM structure.

The above is the detailed content of How to Access Nested Shadow DOM Elements in Chrome Using Selenium?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template