访问影子根目录内的元素

zsb*_*ppa 5 javascript java selenium xpath shadow-dom

是否可以使用java和selenium找到Shadow DOM的元素?

我想从影子根中获取元素

<paper-input id="homeSearch" class="home-search-btn home-inputs" placeholder="Where would you like to go?" no-label-float="" tabindex="0" aria-disabled="false"><iron-icon icon="-search-" slot="prefix" class="form-icons search-icon"></iron-icon></paper-input>
Run Code Online (Sandbox Code Playgroud)

我想发送一个输入,homesearch就像driver.findElement(By.id("homesearch"));我在互联网上搜索但没有得到任何适当的解决方案。

在此输入图像描述

任何类型的帮助将非常感激

Mar*_*cel 2

获取 Shadow dom root 中的元素需要几个步骤。

首先,获取“host”元素,在您的情况下为带有属性的输入page = "home"

WebElement host1 = driver.findElement(By.cssSelector("vrs-app[page='home']"));
Run Code Online (Sandbox Code Playgroud)

之后,您需要执行 JavaScript 脚本以从主机获取影子根,您可以通过调用.shadowRootWeb 元素来获取影子根。

WebElement shadowRoot = (WebElement)((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", host);
Run Code Online (Sandbox Code Playgroud)

但有一个问题,你的输入嵌套在几个 Shadow dom 中,所以你必须这样做几次。最有效的方法是使用一种方法,例如:

public WebElement GetShadowRoot(WebElement host) {
    WebElement shadowRoot = (WebElement)((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", host);
    return shadowRoot ;
}
Run Code Online (Sandbox Code Playgroud)

之后,向下潜入所有阴影根,直到到达所需的主机,如下所示:

WebElement host1 = driver.FindElement(By.cssSelector("vrs-app[page='home']"));
WebElement shadow1 = GetShadowRoot(host1);

WebElement host2 = shadow1.FindElement(By.cssSelector("vrs-home"));
WebElement shadow2 = GetShadowRoot(host2);

// We've reached the shadow dom containing the input
// Note: I'm not using By.id since this may throw an error
WebElement paperInput = shadow2.findElement(By.cssSelector("paper-input[id='homeSearch']"));
Run Code Online (Sandbox Code Playgroud)

现在你可以用 paperInput 做你想做的事情了。

旁注:我知道这个方法在 Chrome 中有效(刚刚测试过),还没有在其他浏览器中测试过。另外,我不懂 Java,所以语言语法可能有点不同。