如何使用 Selenium Java 框架自动化 Shadow DOM

Posted

技术标签:

【中文标题】如何使用 Selenium Java 框架自动化 Shadow DOM【英文标题】:How to automate Shadow DOM using Selenium Java framework 【发布时间】:2021-05-28 14:55:50 【问题描述】:

我正在使用 Selenium Java 框架进行测试自动化,最近该应用程序使用 Shadow DOM 进行了升级。我们尝试使用 javascript 执行器 querySelector 实现自动化。该应用程序在单个页面中有超过 20 个影子根,并且大多数影子根是前一个根的子级。因此,要识别一个元素,我们需要遍历许多根,如 document.querySelector('root1').shadowRoot.querySelector('root2')....一样明智地直到第 n 个根才能找到一个元素。

WebElement DropDown = (WebElement) js.executeScript("return document.querySelector('sn-test-layouts > sn-test-main > sn-test-contents').shadowRoot.querySelector('testroot1').shadowRoot.querySelector('testroot2')");

找到一个元素后,正常的 selenium click 或 select 方法不起作用。所以我使用javascript方法来执行点击,输入文本等。

您能否提供有关使用 selenium Java 自动化 Shadow DOM 的任何其他解决方案的见解。提前致谢

【问题讨论】:

【参考方案1】:

在 Selenium 4.0 中,对于 Chromium 96+ 版本,您可以使用 getShadowRoot() 方法,然后定位子元素。这不应该有任何嵌套问题。

对于旧版本的 Chrome 或 Safari,您需要转换为 SearchContext 而不是 WebElement

如果您使用的是 Firefox 或 Selenium 3,则有更复杂的解决方法。我把它们都写在这里了:https://titusfortner.com/2021/11/22/shadow-dom-selenium.html

【讨论】:

【参考方案2】:

Serenity 提供了一个影子 DOM 处理程序,实现如下所示:

public WebElementFacade getElementInShadowDOM(String shadow, String element) 
    return find(ByExpandedShadowDom.of(shadow))
            .find(By.cssSelector(element));

其中 element 是您要访问的下拉菜单,shadow 是 shadow root 的 css 选择器。 WebElementFacade 是 Serenity 提供的 WebElements 的包装器,它提供了许多很酷且更高效的方法。

请注意,据我所知,目前 SerenityBDD 尚未使用最新的 chrome 和 Selenium 4 进行更新。

【讨论】:

以上是关于如何使用 Selenium Java 框架自动化 Shadow DOM的主要内容,如果未能解决你的问题,请参考以下文章

如何做UI自动化?这里有一份Java Selenium UI自动化框架等着你!

如何提高自动化测试的执行效率 selenium java

RobotFramework自动化测试框架-Selenium Web自动化关于在RobotFramework中如何使用Selenium很全的总结(下)

自动化测试框架selenium+java+TestNG——配置篇

数据驱动框架 - Selenium Webdriver

使用 JAVA 在 selenium 中执行测试的屏幕记录