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?
É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;
}
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
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;
}
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);
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;
Essayez d’utiliser contient ();
String classes = divPubli.getAttribute("class");
assertTrue("The element does not contain .maClass class .publi",classes.contains("maClass"));