it-swarm.com.ru

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

Как я могу проверить, содержит ли веб-элемент Selenium определенный класс CSS?.

У меня есть этот элемент HTML 

<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.

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

20
aurelius

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

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", поиск class.contains ("test") вернет true, но должно быть false

26
drkthng

Ответ, предоставленный @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;
}
7
uesports135

Используйте 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);
1
JohnP2

Аналогично предыдущему, но с возможностями 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;
1
Krystian

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

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