查找类名是否包含特定文本

6

作为我的测试的一部分,系统应该找出用于打开网站的设备是移动设备还是普通桌面设备。

我一直收到以下错误:

"InvalidSelectorError:无法定位具有xpath表达式//*[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")检查其类属性。 - Arran
2个回答

18

您似乎忘记了闭合圆括号和方括号:

将此更改为:

//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解决此问题的方式。


0

这是一个使用错误工具的很好的例子。HTML设计师犯了一个错误,就是使用单个class字符串属性来编码多个值。不幸的是,XPath设计师们虽然有数组构造可用,但未能纠正这个错误。因此,不要使用XPath进行此操作,即使像Mosty Mostacho所说的那样,你也可以让它工作。

CSS设计师做得更好。虽然他们没有做出类似于数组的东西,但至少将class提升到了简单字符串以上。使用By.cssSelector('body.is-mobile') - 这是CSS定位器的正确用法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接