Как проверить, содержит ли элемент определенный атрибут класса
Как проверить, содержит ли веб-элемент 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"));
Ответ 7
Вы можете использовать JQuery:
$( "#yourElement" ).hasClass( "protected" )
или это
$( "#yourElement" ).is( ".pretty.awesome" )
другой пример
$( "#yourElement" ).is( ":hidden" )
см. здесь Как проверить, есть ли у элемента определенный класс