Wie kann ich überprüfen, ob ein Selenium-Webelement eine bestimmte CSS-Klasse enthält?.
Ich habe dieses HTML Li Element
<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}">
Wie Sie im Klassenattribut sehen können, gibt es eine aktive Klasse.
Mein Problem ist, dass ich dieses Element habe, und ich möchte eine Überprüfung durchführen, die darauf basiert, ob das Klassenattribut diesen "aktiven" Wert unter den anderen hat. Dies ist eine elegantere Lösung als die Verwendung von xpath.
Wie kann ich das machen?
Sie haben Ihr Element bereits gefunden UND Sie möchten innerhalb des Klassenattributs nach einer bestimmten Klasse suchen:
public boolean hasClass(WebElement element) {
String classes = element.getAttribute("class");
for (String c : classes.split(" ")) {
if (c.equals(theClassYouAreSearching)) {
return true;
}
}
return false;
}
Wie @aurelius zu Recht betont hat, gibt es einen noch einfacheren Weg (der nicht so gut funktioniert):
public boolean elementHasClass(WebElement element, String active) {
return element.getAttribute("class").contains(active);
}
Dieser Ansatz sieht einfacher aus, hat jedoch einen großen Nachteil:
Wie von @JuanMendes aufgezeigt, werden Sie auf Probleme stoßen, wenn der gesuchte Klassenname eine Unterzeichenfolge von anderen Klassennamen ist:
beispiel: class = "test-a test-b": Bei der Suche nach class.contains ("test") wird true zurückgegeben, es sollte jedoch false sein
Die von @drkthng bereitgestellte Antwort funktioniert, es kann jedoch sein, dass der Klassenname eine Teilmenge eines anderen Klassennamens ist. Zum Beispiel:
<li class="list-group-item ng-scope active">text</li>
Wenn Sie die Klasse "item" finden möchten, würde die angegebene Antwort ein falsch positives Ergebnis ergeben. Vielleicht möchten Sie so etwas versuchen:
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;
}
Durch die Verbesserung der @ uesports135-Antwort sollte "classess" ein String-Array sein.
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;
}
Verwenden Sie 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);
Ähnlich wie die vorherige, jedoch mit Java 8-Funktionen:
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;
Versuchen Sie die Verwendung von enthält ();
String classes = divPubli.getAttribute("class");
assertTrue("The element does not contain .maClass class .publi",classes.contains("maClass"));
du kannst jquery benutzen:
$( "#yourElement" ).hasClass( "protected" )
oder dieses
$( "#yourElement" ).is( ".pretty.awesome" )
ein anderes Beispiel
$( "#yourElement" ).is( ":hidden" )
siehe hier Wie teste ich, ob ein Element eine bestimmte Klasse hat