通过selenium javascriptExecutor访问shadow DOM Elements(聚合物)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过selenium javascriptExecutor访问shadow DOM Elements(聚合物)相关的知识,希望对你有一定的参考价值。

尝试使用Chrome浏览器(V51)的JS控制台上的以下代码访问https://shop.polymer-project.org/的Men's Outer wear部分下的“立即购买”按钮:

document.querySelector('shop-app').shadowRoot.querySelector('shop-home').shadowRoot.querySelector('shop-button');

我尝试使用selenium,第1行:WebElement shopBtn = (WebElement)((javascriptExecutor)driver).executeScript("return document.querySelector('shop-app').shadowRoot.querySelector('shop-home').shadowRoot.querySelector('shop-button')");在自动化测试中访问相同的元素

第2行:shopBtn.click();

此代码提供错误:

Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Cannot read property 'querySelector' of null
  (Session info: chrome=51.0.2704.106)
  (Driver info: chromedriver=2.20.353124 (035346203162d32c80f1dce587c8154a1efa0c3b),platform=Mac OS X 10.11.3 x86_64).

在这方面的任何帮助都非常感谢。

答案

您没有指定,但看起来您正在使用Java。这里有一些有用的代码。 JSE不是必需的。

WebDriver driver = new FirefoxDriver();
String searchText = "Men's Outerwear";
driver.get("https://shop.polymer-project.org/");
WebDriverWait wait = new WebDriverWait(driver, 5);
List<WebElement> sections = wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("div.item")));
for (WebElement section : sections)
{
    if (section.getText().toLowerCase().contains(searchText.toLowerCase()))
    {
        section.findElement(By.linkText("SHOP NOW")).click();
        break;
    }
}
另一答案

您必须逐个遍历阴影根元素才能找到相应的元素。

document.querySelector('nuxeo-app').shadowRoot.querySelector('nuxeo-document-create-button').shadowRoot.querySelector('paper-fab').shadowRoot.querySelector('iron-icon');
另一答案

我试图执行此单击,我能够使用Firefox和使用xpath定位器

.//shop-button/a[starts-with(@aria-label, 'Men') and contains(@aria-label, 'Outerwear Shop Now')]

我正在使用Selenium 3。

我不确定我是否使用了正确的方法

干杯

以上是关于通过selenium javascriptExecutor访问shadow DOM Elements(聚合物)的主要内容,如果未能解决你的问题,请参考以下文章

Python selenium 实例之通过 selenium 查询禅道是否有任务或者 BUG

selenium之怎么断言,selenium通过Assert预知世界

基于python实现UI自动化3.1 selenium通过By定位元素

第三章 selenium元素定位

selenium.common.exceptions.InvalidSelectorException:消息:给定的 xpath 表达式通过 Selenium 在 scrollIntoView 中使用

selenium之怎么断言,selenium通过Assert预知世界