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

时间:2013-11-27 16:05:10

标签: java css xpath selenium

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

我一直收到错误:

  

“InvalidSelectorError:无法找到带有xpath表达式的元素// * [contains(@class,is-mobile ...”

来自萤火虫的财产:

<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应该是什么吗?

2 个答案:

答案 0 :(得分:10)

你似乎错过了收盘和方括号:

改变这个:

//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 ')]

所有这些空格都是为了确保你只匹配空格之间的东西,即使它在class属性的开头或结尾也匹配。

确实很难看,但这是XPath的做法。

答案 1 :(得分:0)

这是使用错误工具的一个很好的例子。 HTML设计者出错的一个原因是使用单个class字符串属性来编码多个值。不幸的是,至少有一个可用的数组结构的XPath设计者无法解决这个错误。所以不要使用XPath,尽管如Mosty Mostacho所说,你可以把它变成owork。

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