单击位于阴影根内部的元素的Null Pointer异常(关闭)
试图用Java脚本处理它:
public WebElement getShadowRootElement(WebElement element) {
return (WebElement)
((JavascriptExecutor)
driver).executeScript("return
arguments[0].shadowRoot", element);
}
结果:
Cannot read property 'shadowRoot' of null
答案 0 :(得分:1)
您可以使用像这样的javascript。
WebElement clearData = (WebElement) js.executeScript("return document.querySelector('button[title='Close Order Status'] svg use').shadowRoot.querySelector('svg path')");
检查How to locate the #shadow-root (open) elements through cssSelector链接以获取更多信息。
答案 1 :(得分:0)
这是解决方案。
WebElement closeElement = (WebElement) js.executeScript("return document.querySelector('button[title='Close Order Status'] svg use').shadowRoot.querySelector('svg path')");
closeElement.click();
快速查找路径的方法
答案 2 :(得分:0)
如果您的用例是要与<path>
标记内的<svg>
元素进行交互,则它确实在 #shadow-root (closed)
之内。
@hayatoito(Shadow DOM的创建者)在此comment中明确提到:
引入封闭的阴影树的最初动机是
"Never allow an access to a node in a closed shadow tree, via any APIs, from outside"
,即AFAIK。这样一来,我们就无法访问Blink中<video>
元素中使用的内部隐藏阴影树中的节点。实际上,我以这种方式设计了一个封闭的影子树。如果可以访问封闭的影子树中的节点,则应将其视为规范的错误。
我认为拥有一个允许访问Chrome应用或扩展程序层的API完全可以。 但是,对于普通的Web应用程序,我认为当前协议为
"Never allow it"
。如果我们允许,那就意味着我们不需要封闭的影子树。我认为只有一棵开放的影子树就足够了。
最近,@ AutomatedTester [Mozilla公司首席培根官David Burns]发起了关于WebDriver - Testability of web components
的讨论当前 Selenium Team 已开放,可以接受对它的请求请求。
在这里您可以找到有关How to automate shadow DOM elements using selenium?的相关讨论
答案 3 :(得分:0)
谢谢您对您的帮助。从iframe切换回默认内容后,“关闭”按钮即被关闭。