一尘不染

如何使用selenium自动实现阴影DOM元素?

selenium

我正在使用Java Selenium项目进行网页自动化。该网页包含许多我无法使用selenium
findElement方法进行交互的多层影子根DOM元素。

我尝试了以下解决方案:

  • Deep CSS(不适用于最新的Chrome浏览器)
  • JS执行器。(这确实很繁琐,并且维护起来很复杂)

注意:

如果您知道我可以在Selenium Java框架中实现的除以上所列之外的任何其他解决方案,请传递该解决方案。提前致谢 !。


阅读 315

收藏
2020-06-26

共1个答案

一尘不染

有一个很好的插件可以与selenium项目链接一起使用。它有助于编写更好,易读和可维护的代码。使用此功能,您可以访问多级影子DOM(最多4级)。这使用简单的CSS选择器来识别元素。

WebElement findElement(String cssSelector) :如果要从DOM获得单个元素,请使用此方法

List<WebElement> findElements(String cssSelector) :如果要从DOM中查找所有元素,请使用此方法

WebElement findElements(WebElement parent, String cssSelector)
:如果要从父对象DOM中查找单个元素,请使用此方法

List<WebElement> findElements(WebElement parent, String cssSelector)
:如果要从父对象DOM中查找所有元素,请使用此方法

WebElement getShadowElement(WebElement parent,String selector)
:如果要从父DOM中查找单个元素,请使用此选项

List<WebElement> getAllShadowElement(WebElement parent,String selector)
:如果要查找父DOM中的所有元素,请使用此方法

boolean isVisible(WebElement element) :如果要查找元素的可见性,请使用此方法

boolean isChecked(WebElement element) :如果要检查是否选中了复选框,请使用此选项

boolean isDisabled(WebElement element) :如果要检查元素是否已禁用,请使用此选项

String getAttribute(WebElement element,String attribute) :如果要获取属性(如aria-
selected)和元素的其他自定义属性,请使用此属性。

void selectCheckbox(String label) :使用它来选择带有标签的复选框元素。

void selectCheckbox(WebElement parentElement, String label)
:使用它来选择带有标签的复选框元素。

void selectRadio(String label) :使用它来选择带有标签的单选元素。

void selectRadio(WebElement parentElement, String label)
:使用此选项使用标签从父DOM中选择单选元素。

void selectDropdown(String label)
:使用此选项可使用标签选择下拉列表项(如果UI上仅存在一个下拉菜单或将其加载,则使用此选项)。

void selectDropdown(WebElement parentElement, String label)
:使用此选项使用标签从父DOM中选择下拉列表项。

如何使用此插件:您将不得不依赖您的项目。

马文

<dependency>
  <groupId>io.github.sukgu</groupId>
  <artifactId>automation</artifactId>
  <version>0.0.4</version>
<dependency>

用于位于阴影根dom元素下的html标签

<properties-page id="settingsPage"> 
  <textarea id="textarea">
</properties-page>

您可以在框架中使用此代码来获取textarea元素Object。

  import io.github.sukgu.*;
  Shadow shadow = new Shadow(driver);
  WebElement element = shadow.findElement("properties-page#settingsPage>textarea#textarea");
  String text = element.getText();
2020-06-26