javascript - 如何使用 selenium 自动化影子 DOM 元素?

标签 javascript java selenium polymer shadow-dom

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

我尝试了以下解决方案:

  • 深层 css(不适用于最新的 chrome 浏览器)
  • JS 执行器。 (这真的很乏味,维护起来也很复杂)

备注:

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

最佳答案

selenium项目有一个很好用的插件shadow-automation-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>

对于位于 shadow-root dom 元素下的 html 标签

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

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

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

关于javascript - 如何使用 selenium 自动化影子 DOM 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55761810/

相关文章:

javascript - 插入英文字符,取回希腊字符(javascript)

java - 如何在hql中对两个具有相同关键字的字段进行搜索操作?

java - 无法从 Booking.com 的搜索结果中获取价格

javascript - 使用 jquery 获取排序后的第一个子 <div> 类名

javascript - 用图像翻转 Div 或者只是图像 onClick=flip ('ID NAME' );

javascript - 在项目中运行时无法识别“webpack”

java - 程序类型已存在 : retrofit2. Converter$Factory Retrofit 编译错误

Java 正则表达式捕获组

java - 在没有测试框架的情况下使用 Selenium 2?

java - Selenium 使用太多内存