web-dev-qa-db-fra.com

Comment vérifier si l'élément contient un attribut de classe spécifique

Comment puis-je vérifier si un élément Web Selenium contient une classe css spécifique?.

J'ai cet élément 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}">

Comme vous pouvez le voir dans l'attribut de classe, il existe une classe active.

Mon problème est que j'ai cet élément et que je veux faire une vérification basée sur si l'attribut class a cette valeur "active" parmi les autres, étant une solution plus élégante que d'utiliser xpath.

Comment puis-je faire ceci? 

20
aurelius

Étant donné que vous avez déjà trouvé votre élément ET que vous souhaitez vérifier une classe donnée dans l'attribut class:

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

    return false;
}

MODIFIER

Comme @aurelius l'a fait remarquer à juste titre, il existe un moyen encore plus simple (cela ne fonctionne pas très bien):

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

Cette approche semble plus simple mais présente un inconvénient majeur:

Comme l'a souligné @JuanMendes, vous rencontrerez des problèmes si le nom de la classe que vous recherchez est une sous-chaîne d'autres noms de classes:

par exemple, class = "test-a test-b", la recherche de class.contains ("test") renverra la valeur true, mais elle devrait être false

26
drkthng

La réponse fournie par @drkthng fonctionne, mais vous pouvez avoir un cas où le nom de la classe est un sous-ensemble d'un autre nom de classe. Par exemple:

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

Si vous vouliez trouver la classe "item", la réponse fournie donnerait un faux positif. Vous voudrez peut-être essayer quelque chose comme ceci:

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

Utilisez 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

Semblable au précédent, mais avec les capacités de 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

Essayez d’utiliser contient ();

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