Java 如何检查元素是否包含特定的类属性
如何检查selenium web元素是否包含特定的css类 我有这个html元素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}"> 正如您在
<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$”)
@drkthngelementHasClass
方法是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));
}
}