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

aur*_*ius 23 css java selenium webdriver selenium-webdriver

如何检查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}">
Run Code Online (Sandbox Code Playgroud)

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

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

我怎样才能做到这一点?

drk*_*hng 30

鉴于您已找到您的元素并且您想要检查class-attribute中的某个类:

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

    return false;
}
Run Code Online (Sandbox Code Playgroud)

编辑

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

public boolean elementHasClass(WebElement element, String active) {
    return element.getAttribute("class").contains(active);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • -1因为编辑不够好,如果你搜索一个类的子串,它会给你误报,例如`class ="test-a test-b"`,搜索`class.contains("test ")`将返回true但它应该是false (3认同)
  • 更正:它当然应该是 `.getAttribute("class").matches("^classname .*|.* classname .*|.* classname$|^classname$")` (2认同)
  • 编辑 2 没有有效的代码。split 方法返回一个字符串数组,它没有 contains 方法。为了执行此操作,您需要首先将数组转换为列表。 (2认同)

ues*_*135 8

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

<li class="list-group-item ng-scope active">text</li>
Run Code Online (Sandbox Code Playgroud)

如果你想找到班级"项目",那么提供的答案会给出误报.您可能想尝试这样的事情:

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;
}
Run Code Online (Sandbox Code Playgroud)