【问题标题】:Shadow Root - click in a href under several shadow rootsShadow Root - 点击几个shadow root下的href
【发布时间】:2018-09-11 12:44:19
【问题描述】:

我在几个 shadowRoots 中有一个链接列表。已经解决了这个问题。

public WebElement expandRootElement(WebElement element) {
    WebElement ele = (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot",element);
    return ele;
}

WebElement root5_adminPanel = shadowRoot4_MduiContainerChild2.findElement(By.cssSelector("#layout > border-layout > ng-view > admin-panel"));
WebElement shadowRoot5_AdminPanel= expandRootElement(root5_adminPanel);

WebElement root6_breadCrumb = shadowRoot5_AdminPanel.findElement(By.cssSelector("#layout > border-layout > breadcrumb"));
WebElement shadowRoot6_breadCrumb = expandRootElement(root6_breadCrumb);

WebElement root6_domainPanel = shadowRoot5_AdminPanel.findElement(By.cssSelector("#layout > border-layout > ng-view > gdsr-domain-panel"));
WebElement shadowRoot6_domainPanel = expandRootElement(root6_domainPanel);

WebElement root7_selectDomain = shadowRoot6_domainPanel.findElement(By.cssSelector("#domainContainer > domain-panel-item.ng-binding.last"));
WebElement shadowRoot7_selectDomain = expandRootElement(root7_selectDomain);

当我到达shadowRoot7 时,我有一个同名项目列表,我已经创建了一个列表来修复它。

List<WebElement> rows_table = shadowRoot6_domainPanel.findElements(By.cssSelector("#domainContainer > domain-panel-item:nth-child(n)"));

(大约有 45 个项目)

这将选择所有这些,在本例中是所有域面板项行。

我的问题是每个域面板项仍然包含另一个 shadowRoot(所有这些项的路径相同)我想选择一个随机项目,而不是第一个或最后一个,例如项目编号 43 .

enter image description here

我的解决方案是这个,但它不起作用,因为它无法访问我想要的链接:

public void clickSelectedDomain(String domain) {
    List<WebElement> rows_table = shadowRoot6_domainPanel.findElements(By.cssSelector("#domainContainer > gdsr-domain-panel-item:nth-child(n)"));

    int rows_count = rows_table.size();

    for (int row=0; row<rows_count; row++) { 
        if(rows_table.get(row).getAttribute("href").contains(domain)) {
            rows_table.get(row).click();
        }
    }
}

有人知道如何解决这个问题?

【问题讨论】:

  • 提供HTML解决

标签: java selenium selenium-webdriver shadow-dom


【解决方案1】:

您解决了这个问题,通过递归调用executeScript() 来获取重叠的Shadow DOM,但实际上您可以只调用一次executeScript(),然后在里面依次获取Shadow DOM。 p>

driver.executeScript( function ()
{       
    var root1 = document.querySelector( 'selector string 1' ).shadowRoot 
    var root2 = root1.querySelector( 'selector string 2' ).shadowRoot
    var root3 = root2.querySelector( 'selector string 3' ).shadowRoot
    ...
    return foundElement
}

无论如何,在for() {}循环中,你应该最后一次提取最终的Shadow DOM,然后选择&lt;a&gt;元素来检查它的内容。

【讨论】:

  • 但是我如何只调用执行脚本一次呢?你能给我那个解决方案吗?
  • 我添加了一个例子
  • 我正在尝试执行您的示例,但它不起作用。
  • 你能举一个真实数据的例子吗?
  • @CelsoPereira 也许你应该先提供一个例子。
猜你喜欢
  • 2021-09-06
  • 2018-05-24
  • 2017-09-01
  • 1970-01-01
  • 2018-05-11
  • 2021-09-17
  • 2022-08-07
  • 2019-04-25
  • 2016-05-24
相关资源
最近更新 更多