Javascript 访问阴影根中的元素

Javascript 访问阴影根中的元素,javascript,java,selenium,xpath,shadow-dom,Javascript,Java,Selenium,Xpath,Shadow Dom,使用java和selenium可以找到影子DOM的元素吗 我想从阴影根中获取元素 获取阴影dom根目录中的元素需要几个步骤 首先,获取“host”元素,在您的例子中是带有属性page=“home” 之后,您需要执行一个JavaScript脚本从主机获取影子根,您可以通过在web元素上调用.shadowRoot来获取影子根 WebElement shadowRoot = (WebElement)((JavascriptExecutor) driver).executeScript("return

使用java和selenium可以找到影子DOM的元素吗

我想从阴影根中获取元素


获取阴影dom根目录中的元素需要几个步骤

首先,获取“host”元素,在您的例子中是带有属性
page=“home”

之后,您需要执行一个JavaScript脚本从主机获取影子根,您可以通过在web元素上调用
.shadowRoot
来获取影子根

WebElement shadowRoot = (WebElement)((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", host);
但是有一个问题,您的输入嵌套在几个影子DOM中,所以您必须多次这样做。最有效的方法是使用一种方法,例如:

public WebElement GetShadowRoot(WebElement host) {
    WebElement shadowRoot = (WebElement)((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", host);
    return shadowRoot ;
}
之后,向下俯冲所有阴影根,直到到达所需的宿主,如下所示:

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']"));
现在你可以用paperInput做你想做的事情了


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

不要将HTML代码示例作为图像文件共享-提供标题文本。很抱歉,我正在尝试复制HTML站点,不允许以有组织的方式发送代码…如果您愿意,我可以将站点地址共享给您。如果它是公共页面,它可能也很有用……只需使用您之前提供的页面进行测试,我就可以将文本发送到WebElement paperInput
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']"));