web-dev-qa-db-ja.com

要素に特定のクラス属性が含まれているかどうかを確認する方法

Selenium Web要素に特定のcssクラスが含まれているかどうかを確認するにはどうすればよいですか。

私はこの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}">

内部クラス属性を見るとわかるように、アクティブなクラスがあります。

私の問題は、私がこの要素を持っていることと、クラス属性が他の中でその「アクティブな」値を持っているかどうかに基づいてチェックを行いたいということです。

これどうやってするの?

23
aurelius

既に要素を見つけていて、クラス属性内の特定のクラスを確認したい場合:

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

    return false;
}

編集

@aureliusが正しく指摘したように、さらに簡単な方法があります(これはうまく機能しません):

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

このアプローチは簡単に見えますが、1つの大きな注意点があります。

@JuanMendesが指摘したように、検索しているクラス名が他のクラス名のサブストリングである場合、問題が発生します。

たとえば、class = "test-a test-b"、class.contains( "test")を検索するとtrueが返されますが、falseでなければなりません

30
drkthng

@drkthngが提供する答えは機能しますが、クラス名が別のクラス名のサブセットである場合があります。例えば:

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

クラス「アイテム」を見つけたい場合、提供された答えは誤検知を与えます。次のようなものを試してみてください:

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

@ uesports135の回答を改善すると、「classess」は文字列配列になります。

 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

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

前のものと似ていますが、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

Contains()を使用してみてください。

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

jqueryを使用できます。

$( "#yourElement" ).hasClass( "protected" )

またはこれ

$( "#yourElement" ).is( ".pretty.awesome" )

もう一つの例

$( "#yourElement" ).is( ":hidden" )

ここを参照してください 要素に特定のクラスがあるかどうかをテストする方法

0
Ben.S