Shadow Root - кликните в href под несколькими теневыми корнями - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть список ссылок внутри нескольких 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 .

введите описание изображения здесь

Мое решение было таким, но оно не работает, потому что не имеет доступа к ссылке, которую я хочу:

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();
        }
    }
}

У некоторых есть идеи, как это исправить?

1 Ответ

0 голосов
/ 15 сентября 2018

Вы решили проблему , рекурсивно вызвав executeScript(), чтобы получить встроенные Shadow DOM, но на самом деле вы могли просто позвонить executeScript() один раз, а внутри получить Shadow DOM последовательно.

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 в последний раз, а затем выбрать элемент <a>, чтобы проверить его содержимое.

...