找出类名是不是包含某些文本

Posted

技术标签:

【中文标题】找出类名是不是包含某些文本【英文标题】:Find out if class name contains certain text找出类名是否包含某些文本 【发布时间】:2013-12-13 09:09:36 【问题描述】:

作为我测试的一部分,系统应该确定用于打开网站的设备是移动设备还是普通台式机。

我不断收到错误:

"InvalidSelectorError: Unable to locate an element with the xpath expression //*[contains(@class, is-mobile..."

firebug 的属性:

<body class="login-page is-desktop">

我的测试:

public class isMobile 

public static boolean isMobile = false;

public static boolean checkIfMobile(WebDriver driver) throws Exception 

    List<WebElement> list = driver.findElements(By
            .xpath("//body[contains(@class, 'is-mobile'"));
    if (list == null) 
        return false;
     else 
        return true;
    


谁能告诉我正确的 XPath 应该是怎样的?

【问题讨论】:

或者,只需先获取 body 元素(使用您想要的任何方法 - 例如 //body),然后通过 element.getAttribute("class") 检查它的类属性。 【参考方案1】:

这是使用错误工具的一个很好的例子。 html 设计者出错的一件事是使用单个 class 字符串属性来编码多个值。不幸的是,XPath 设计者(他们至少有一个可用的数组构造)未能纠正这个错误。所以不要为此使用 XPath,尽管正如莫斯蒂·莫斯塔乔所说,你可以让它正常工作。

CSS 设计师做得更好。尽管他们没有做类似数组的事情,但他们至少将class 提升到了一个简单的字符串之上。使用By.cssSelector('body.is-mobile') - 这是对 CSS 定位器的正确使用。

【讨论】:

【参考方案2】:

您似乎缺少结束的圆括号和方括号:

改变这个:

//body[contains(@class, 'is-mobile'

进入这个:

//body[contains(@class, 'is-mobile')]

附带说明,请注意此代码还有另一个稍微隐藏的问题,即您将匹配您不想匹配的内容,例如此类属性:login-page not-is-mobile

没有办法像使用 CSS3 选择器 [class~="is-mobile"] 那样简单地匹配它。但是,您可以通过这样做来解决这个问题:

//body[contains(concat(' ', @class, ' '), ' is-mobile ')]

所有这些空格都是为了确保您只会匹配空格之间的某些内容,并且即使它位于类属性的开头或结尾,它也会匹配。

确实很丑,但这就是 XPath 的做法。

【讨论】:

以上是关于找出类名是不是包含某些文本的主要内容,如果未能解决你的问题,请参考以下文章

影响所有图像的脚本而不是仅包含某些文本的div中的图像(jQuery)

如何在opencv中检测仅包含文本的图像是不是模糊

Excel 用啥函数可以判断一个字符串中是不是包含某些字符

jQuery 选择器 - 检查当前 div 属性是不是包含文本?

如何检查类名中是不是存在单词?

如果单元格包含某些文本,则锁定相邻单元格