Как проверить, содержит ли элемент определенный атрибут класса

Как проверить, содержит ли веб-элемент selenium определенный класс 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}">

Как вы можете видеть внутри атрибута класса, существует активный класс.

Моя проблема в том, что у меня есть этот элемент, и я хочу сделать проверку на основе того, имеет ли атрибут class это "активное" значение среди других, будучи более элегантным решением, а затем использует xpath.

Как я могу это сделать?

Ответ 1

Учитывая, что вы уже нашли свой элемент AND, вы хотите проверить определенный класс внутри атрибута class:

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

    return false;
}

ИЗМЕНИТЬ

Как справедливо указал @aurelius, существует еще более простой способ (это работает не очень хорошо):

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

Этот подход выглядит проще, но имеет одно большое оговорку:

Как указано @JuanMendes, вы столкнетесь с проблемами, если имя класса, которое вы ищете, является подстрокой других имен классов:

например class= "test-a test-b", поиск класса .contains( "test" ) вернет true, но он должен быть false

Ответ 2

Ответ, предоставленный @drkthng, работает, но у вас может быть случай, когда имя класса является подмножеством другого имени класса. Например:

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

Если вы хотите найти класс "item", то предоставленный ответ даст ложный результат. Возможно, вы захотите попробовать что-то вроде этого:

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;
}

Ответ 3

Совместим с предыдущим, но с возможностями java 8:

String classes= getDriver().findElement(someSelector).getAttribute("class");
Optional<String> classFindResult = Arrays.stream(elementClasses.split(" ")).filter(el -> el.equals("myClass")).findFirst();
if(openClassFindResult.isPresent()){
    return true;
}
return false;

Ответ 4

Используйте javascript: classList.contains

 WebElement element = By.id("id");
 String className = "hidden";
 JavascriptExecutor js = (JavascriptExecutor) driver;
 Boolean containsClass = js.executeScript("return arguments[0].classList.contains(arguments[1])", element, className);

Ответ 5

Улучшение ответа @uesports135: "classess" должен быть массивом String.

 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;
    }

Ответ 6

Попробуйте использовать contains();

String classes = divPubli.getAttribute("class");
assertTrue("The element does not contain .maClass class .publi",classes.contains("maClass"));