需要帮助以单击阴影根(封闭)类型下的元素

时间:2019-06-07 19:33:45

标签: java selenium google-chrome shadow-dom sfdc

单击位于阴影根内部的元素的Null Pointer异常(关闭)

试图用Java脚本处理它:

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

enter image description here

结果:

Cannot read property 'shadowRoot' of null

添加了屏幕截图: 1. enter image description here

enter image description here

4 个答案:

答案 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();     

快速查找路径的方法

仅提供屏幕截图即可获得如何找到路径的想法。 (仅供参考,此屏幕截图用于Chrome清除历史记录中的清除数据按钮) enter image description here

答案 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"

     

如果我们允许,那就意味着我们不需要封闭的影子树。我认为只有一棵开放的影子树就足够了。


WebDriver透视图

最近,@ AutomatedTester [Mozilla公司首席培根官David Burns]发起了关于WebDriver - Testability of web components

的讨论

当前 Selenium Team 已开放,可以接受对它的请求请求。


Outro

在这里您可以找到有关How to automate shadow DOM elements using selenium?的相关讨论

答案 3 :(得分:0)

谢谢您对您的帮助。从iframe切换回默认内容后,“关闭”按钮即被关闭。