it-swarm.com.de

So prüfen Sie, ob das Element ein bestimmtes Klassenattribut enthält

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? 

20
aurelius

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

BEARBEITEN

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

26
drkthng

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

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;
    }
1
John Collins

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);
1
JohnP2

Ä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;
1
Krystian

Versuchen Sie die Verwendung von enthält ();

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

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

0
Ben.S