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"));我在互联网上搜索但没有得到任何适当的解决方案。
任何类型的帮助将非常感激
获取 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,所以语言语法可能有点不同。
| 归档时间: |
|
| 查看次数: |
5517 次 |
| 最近记录: |