Java 如何检查元素是否包含特定的类属性

Java 如何检查元素是否包含特定的类属性,java,css,selenium,selenium-webdriver,webdriver,Java,Css,Selenium,Selenium Webdriver,Webdriver,如何检查selenium web元素是否包含特定的css类 我有这个html元素 <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}"> 正如您在

如何检查selenium web元素是否包含特定的css类

我有这个html元素

<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}">
  • 正如您在class属性中看到的,有一个活动类

    我的问题是,我有这个元素,我想根据class属性是否具有其他属性中的“active”值进行检查,这是比使用xpath更优雅的解决方案


    我该怎么做

    假设您已经找到了元素,并且希望在class属性中检查某个类:

    public boolean hasClass(WebElement element) {
        String classes = element.getAttribute("class");
        for (String c : classes.split(" ")) {
            if (c.equals(theClassYouAreSearching)) {
                return true;
            }
        }
        
        return false;
    }
    
    #编辑 正如@aurelius正确指出的,还有一种更简单的方法(效果不太好):

    这种方法看起来更简单,但有一个很大的警告:

    正如@JuanMendes所指出的,如果您正在搜索的类名是其他类名的子字符串,您将遇到问题:

    例如class=“test-a test-b”,搜索class.contains(“test”)将返回true,但应为false

    #编辑2 尝试组合两个代码段:

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

    这应该可以解决您的警告。

    由@drkthng提供的答案是有效的,但您可能会遇到这样的情况,即类名是另一个类名的子集。例如:

    <li class="list-group-item ng-scope active">text</li>
    
    尝试使用contains()


    与上一个类似,但具有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;
    
    String classes=getDriver().findelelement(someSelector).getAttribute(“类”);
    可选的classFindResult=Arrays.stream(elementClasses.split(“”).filter(el->el.equals(“myClass”)).findFirst();
    if(openClassFindResult.isPresent()){
    返回true;
    }
    返回false;
    
    使用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);
    

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

    基于一种常见的pre-
    classList
    javascript技术:

    public boolean hasClass(WebElement element, String theClass) {
        return (" " + element.getAttribute("class") + " ").contains(" " + theClass + " ");
    }
    
    对于寻求C#实现的任何人:

    public static class WebElementExtensions
    {
        private static Regex _classNameValidatorRegex = new Regex(@"^[a-z][a-z0-9\-_]*$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        private static Regex _whiteSpaceRegex = new Regex(@"\s+");
    
        public static bool HasClass(this IWebElement element, params string[] htmlClasses)
        {
            if (!htmlClasses.Any())
                throw new ArgumentException("No html classes to match.");
    
            if (!htmlClasses.All(c => _classNameValidatorRegex.IsMatch(c)))
                throw new ArgumentException("Invalid CSS class(es) detected.");
    
            var classAttribute = element.GetAttribute("class");
            if (string.IsNullOrWhiteSpace(classAttribute))
                return false;
    
            var elementClasses = _whiteSpaceRegex.Split(classAttribute.Trim()).ToHashSet();
    
            return htmlClasses.All(c => elementClasses.Contains(c));
        }
    
        public static bool HasAnyClass(this IWebElement element, params string[] htmlClasses)
        {
            if (!htmlClasses.Any())
                throw new ArgumentException("No html classes to match.");
    
            if (!htmlClasses.All(c => _classNameValidatorRegex.IsMatch(c)))
                throw new ArgumentException("Invalid CSS class(es) detected.");
    
            var classAttribute = element.GetAttribute("class");
            if (string.IsNullOrWhiteSpace(classAttribute))
                return false;
    
            var elementClasses = _whiteSpaceRegex.Split(classAttribute.Trim()).ToHashSet();
    
            return htmlClasses.Any(c => elementClasses.Contains(c));
        }
    }
    

    包含(“活动”)就足够了,谢谢-1因为编辑不够好,如果您搜索类的子字符串,例如
    class=“test-a test-b”
    ,搜索
    class.contains(“test”)
    将返回true,但应该是错误更正:当然应该是
    .getAttribute(“class”).matches(“^classname.*.*classname.*.*classname$^classname$”)
    @drkthng
    elementHasClass
    方法是suuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuking代表“nav”,您有“nav item”类。classFindResult应该被选中,而不是openClassFindResult,并且使用三元运算符会更优雅一些。无论如何,您已经有了我的投票权。我认为您可以使用
    anyMatch()
    方法,而不是进行筛选,然后检查是否存在任何值。
    Arrays.stream(elementClasses.split(“”)。任意匹配(css->css.equals(“myClass”);
    很好的解决方法
     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;
        }
    
    public boolean hasClass(WebElement element, String theClass) {
        return (" " + element.getAttribute("class") + " ").contains(" " + theClass + " ");
    }
    
    public static class WebElementExtensions
    {
        private static Regex _classNameValidatorRegex = new Regex(@"^[a-z][a-z0-9\-_]*$", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        private static Regex _whiteSpaceRegex = new Regex(@"\s+");
    
        public static bool HasClass(this IWebElement element, params string[] htmlClasses)
        {
            if (!htmlClasses.Any())
                throw new ArgumentException("No html classes to match.");
    
            if (!htmlClasses.All(c => _classNameValidatorRegex.IsMatch(c)))
                throw new ArgumentException("Invalid CSS class(es) detected.");
    
            var classAttribute = element.GetAttribute("class");
            if (string.IsNullOrWhiteSpace(classAttribute))
                return false;
    
            var elementClasses = _whiteSpaceRegex.Split(classAttribute.Trim()).ToHashSet();
    
            return htmlClasses.All(c => elementClasses.Contains(c));
        }
    
        public static bool HasAnyClass(this IWebElement element, params string[] htmlClasses)
        {
            if (!htmlClasses.Any())
                throw new ArgumentException("No html classes to match.");
    
            if (!htmlClasses.All(c => _classNameValidatorRegex.IsMatch(c)))
                throw new ArgumentException("Invalid CSS class(es) detected.");
    
            var classAttribute = element.GetAttribute("class");
            if (string.IsNullOrWhiteSpace(classAttribute))
                return false;
    
            var elementClasses = _whiteSpaceRegex.Split(classAttribute.Trim()).ToHashSet();
    
            return htmlClasses.Any(c => elementClasses.Contains(c));
        }
    }