如何检查元素是否包含特定的 class 属性
How to check if element contains specific class attribute
如何检查 selenium 网络元素是否包含特定的 css class.
我有这个 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}">
如您所见,在 class 属性中有一个活动的 class.
我的问题是我有这个元素,我想根据 class 属性是否具有其他 "active" 值进行检查,这是比使用 xpath 更优雅的解决方案。
我该怎么做?
鉴于您已经找到了您的元素,并且您想要检查 class 属性中的某个 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 正确指出的那样,还有一种更简单的方法(效果不是很好):
public boolean elementHasClass(WebElement element, String active) {
return element.getAttribute("class").contains(active);
}
这种方法看起来更简单,但有一个重要警告:
正如@JuanMendes 所指出的,如果您要搜索的 class-名称是其他 class-名称的子字符串,您将 运行 遇到问题:
for example class="test-a test-b", searching for class.contains("test") will return true but it should be false
#编辑 2
尝试合并两个代码片段:
public boolean elementHasClass(WebElement element, String active) {
return Arrays.asList(element.getAttribute("class").split(" ")).contains(active);
}
这应该可以解决您的警告。
@drkthng 提供的答案有效,但您可能遇到 class 名称是另一个 class 名称的子集的情况。例如:
<li class="list-group-item ng-scope active">text</li>
如果您想找到 class "item",那么提供的答案会给出误报。你可能想尝试这样的事情:
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;
}
尝试使用 contains();
String classes = divPubli.getAttribute("class");
assertTrue("The element does not contain .maClass class .publi",classes.contains("maClass"));
与上一个类似,但具有 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;
使用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;
}
基于常见的预 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));
}
}
如何检查 selenium 网络元素是否包含特定的 css class.
我有这个 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}">
如您所见,在 class 属性中有一个活动的 class.
我的问题是我有这个元素,我想根据 class 属性是否具有其他 "active" 值进行检查,这是比使用 xpath 更优雅的解决方案。
我该怎么做?
鉴于您已经找到了您的元素,并且您想要检查 class 属性中的某个 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 正确指出的那样,还有一种更简单的方法(效果不是很好):
public boolean elementHasClass(WebElement element, String active) {
return element.getAttribute("class").contains(active);
}
这种方法看起来更简单,但有一个重要警告:
正如@JuanMendes 所指出的,如果您要搜索的 class-名称是其他 class-名称的子字符串,您将 运行 遇到问题:
for example class="test-a test-b", searching for class.contains("test") will return true but it should be false
#编辑 2 尝试合并两个代码片段:
public boolean elementHasClass(WebElement element, String active) {
return Arrays.asList(element.getAttribute("class").split(" ")).contains(active);
}
这应该可以解决您的警告。
@drkthng 提供的答案有效,但您可能遇到 class 名称是另一个 class 名称的子集的情况。例如:
<li class="list-group-item ng-scope active">text</li>
如果您想找到 class "item",那么提供的答案会给出误报。你可能想尝试这样的事情:
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;
}
尝试使用 contains();
String classes = divPubli.getAttribute("class");
assertTrue("The element does not contain .maClass class .publi",classes.contains("maClass"));
与上一个类似,但具有 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;
使用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;
}
基于常见的预 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));
}
}