如何解决使用 Java 在 selenium 中访问 shadow root 中的元素
我正在尝试访问 shadow-root (closed)
元素内的“解决挑战”按钮,如下所示:
我试过了:
driver.findElement(By.xpath("//*[@id=\"solver-button\"]")).click();
但由于 shadow-root
元素而无法访问该按钮。
我正在寻找一种方法来访问影子根元素中 ID 为 solver-button
的按钮。
解决方法
shadowbutton = driver.execute_script("return document.querySelector('div[class=\"button-holder help-button-holder\"]').shadowRoot.querySelector('button[id=\"solver-button\"]')")
shadowbutton.click()
shadowRoot
不是 DOM 的一部分,因此您首先必须找到具有影子根的根元素,然后使用 shadowRoot
调用它,然后从中调用目标元素。
title 为 Solve the Challenge 的元素位于 #shadow-root (open)
解决方案
要在所需元素上使用 click()
,您可以使用 shadowRoot.querySelector()
并且您可以使用以下 Locator Strategy:
WebElement solverButton = (WebElement) js.executeScript("return document.querySelector('div.button-holder.help-button-holder').shadowRoot.querySelector('button#solver-button')");
solverButton.click();
参考文献
您可以在以下位置找到一些相关的详细讨论:
- How to interact with the elements within #shadow-root (open) while Clearing Browsing Data of Chrome Browser using cssSelector
- How to automate shadow DOM elements using selenium?
如果点击 <div class="button-holder help-button-holder"></div>
元素的父元素 (shadow-root
) 就足够了,this post 可能会有所帮助。
要在 help-button-holder
元素上执行鼠标单击,您可以使用 moveToElement
method 如下:
WebElement buttonHolderElement = driver.findElement(By.xpath("//*[@id=\"rc-imageselect\"]/div[3]/div[2]/div[1]/div[1]/div[4]"));
Actions actionProvider = new Actions(driver);
actionProvider.moveToElement(buttonHolderElement).click().build().perform();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。