如何检查元素是否包含特定的类属性

新手上路,请多包涵

如何检查 selenium web 元素是否包含特定的 css 类。

我有这个 html li 元素

<li class="list-group-item ng-scope active" ng-repeat="report in lineageController.reports" ng-click="lineageController.activate(report)" ng-class="{active : lineageController.active == report}">

正如您在类属性中看到的那样,有一个活动类。

我的问题是我有这个元素,我想根据类属性是否具有其他“活动”值进行检查,这是比使用 xpath 更优雅的解决方案。

我怎样才能做到这一点?

原文由 aurelius 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 650
2 个回答

鉴于您已经找到了您的元素,并且您想要检查类属性中的某个类:

 public boolean hasClass(WebElement element) {
    String classes = element.getAttribute("class");
    for (String c : classes.split(" ")) {
        if (c.equals(theClassYouAreSearching)) {
            return true;
        }
    }

    return false;
}

#EDIT 正如@aurelius 正确指出的那样,还有一种更简单的方法(效果不是很好):

 public boolean elementHasClass(WebElement element, String active) {
    return element.getAttribute("class").contains(active);
}

这种方法看起来更简单,但有一个很大的警告:

正如@JuanMendes 所指出的,如果您要搜索的类名是其他类名的子字符串,您将遇到问题:

例如 class=“test-a test-b”,搜索 class.contains(“test”) 将返回 true 但它应该是 false

#EDIT 2 尝试组合两个代码片段:

 public boolean elementHasClass(WebElement element, String active) {
    return Arrays.asList(element.getAttribute("class").split(" ")).contains(active);
}

那应该可以解决您的警告。

原文由 drkthng 发布,翻译遵循 CC BY-SA 4.0 许可协议

@drkthng 提供的答案有效,但您可能会遇到类名是另一个类名的子集的情况。例如:

 <li class="list-group-item ng-scope active">text</li>

如果您想找到“项目”类,那么提供的答案将给出误报。你可能想尝试这样的事情:

 public boolean hasClass(WebElement element, String htmlClass) {
    String classes = element.getAttribute("class").split("\\s+");
    if (classes != null) {
        for (String classAttr: classes) {
            if (classAttr.equals(htmlClass)) {
                return true;
            }
        }
    }
    return false;
}

原文由 uesports135 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题