2015-09-22 21 views
11

Wie kann ich überprüfen, ob ein Selen-Web-Element eine bestimmte CSS-Klasse enthält?Wie überprüft man, ob ein Element ein spezifisches Klassenattribut 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 innerhalb der Klasse sehen Attribut eine aktive Klasse.

Mein Problem ist, dass ich dieses Element habe und ich möchte eine Überprüfung basierend darauf durchführen, ob das Klassenattribut diesen "aktiven" Wert unter den anderen hat, wobei elegantere Lösung dann xpath ist.

Wie kann ich das tun?

Antwort

16

erbracht Sie bereits Ihr Element und Sie möchten für eine bestimmte Klasse innerhalb der Klasse-Attribut überprüfen:

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

    return false; 
} 

EDIT

Wie @aurelius zu Recht ausgeführt hat, gibt es eine noch einfachere Art und Weise (das nicht funktioniert sehr gut):

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

Dieser Ansatz sieht einfacher, aber hat einen großen Nachteil:

Wie @JuanMendes wies darauf hin, Sie werden auf Probleme stoßen, wenn der Klassenname, nach dem Sie suchen ein Teil anderer Klassennamen ist:

zum Beispiel class = „Test-a test-b“ wird return true für class.contains („test“) gesucht, aber es sollte

+1

classes.contains ("aktiv") ist genug, vielen Dank dafür! – aurelius

+1

ja! aktualisierte meine Antwort! guter Punkt Mann! – drkthng

+0

danke für die Beteiligung an diesem! – aurelius

6

die Antwort zur Verfügung gestellt von @drkthng Werken falsch sein, aber Sie könnten einen Fall, wo der Klassenname eine Teilmenge eines anderen Klasse Namen ist. Zum Beispiel:

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

Wenn Sie die Klasse "Element" finden möchten, würde die angegebene Antwort einen falschen positiven geben. Möglicherweise möchten Sie Folgendes 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; 
} 
+0

Sie haben Recht! Vielen Dank! – aurelius

0

Versuchen Sie, contains();

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

Dies ist keine korrekte Lösung - zum Beispiel wird es nicht fehlschlagen, wenn Sie nach 'nav' suchen und Sie haben 'nav-item' Klasse. – Krystian

1

Simmilar zum vorherigen, aber mit Java-8-Fähigkeiten:

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; 
+0

classFindResult sollte nicht openClassFindResult überprüft werden, und wäre es etwas eleganter, den ternären Operator zu verwenden. Wie auch immer, du hast bereits mein upvote. – aurelius

Verwandte Themen