Shadow Root - click in a href under several shadow roots
Shadow Root - click in a href under several shadow roots
I have a list of links inside of several shadowRoots. Already solved this problem.
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);
When I reach this shadowRoot7, I have a list of items with the same name, which I already created a List to fix it.
shadowRoot7
List<WebElement> rows_table = shadowRoot6_domainPanel.findElements(By.cssSelector("#domainContainer > domain-panel-item:nth-child(n)"));
(They are around 45 items)
This will select all of them, in this case all the domain-panel-item rows.
My problem is that each domain-panel-item still contain another shadowRoot (the same path for all of them) an i would like to select a random item, not the first or last one, for example, the item number 43.
enter image description here
My solution was this one but it doesn't work because it doesnt access to the link that i want:
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();
Some have an idea how to fix this?
1 Answer
1
You solved the problem by calling recursively executeScript() in order to get the imbricated Shadow DOMs but actually you could have just called executeScript() once, and inside got the Shadow DOMs successively.
executeScript()
executeScript()
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
Anyways, in the for() loop, you should extract the ultimate Shadow DOM one last time, and then select the <a> element to check its content.
for()
<a>
But how would I call the executedscript only once? Could you provide me that solution?
– Celso Pereira
Sep 15 '18 at 22:17
I'v added an example
– Supersharp
Sep 16 '18 at 0:12
I am trying to execute your example but it doesn't work.
– Celso Pereira
Oct 11 '18 at 13:42
Could you give an example with real data?
– Celso Pereira
Oct 11 '18 at 13:42
@CelsoPereira maybe you should provide an example first.
– Supersharp
Oct 11 '18 at 15:25
Thanks for contributing an answer to Stack Overflow!
But avoid …
To learn more, see our tips on writing great answers.
Required, but never shown
Required, but never shown
By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy
Provide HTML to solve
– iamsankalp89
Sep 12 '18 at 5:12