2013-11-27 35 views
2

作为我测试的一部分,系统应该查明用于打开网站的设备是移动设备还是普通桌面。找出类名是否包含某些文本

我不断收到错误:

从萤火

"InvalidSelectorError: Unable to locate an element with the xpath expression //*[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应该如何?

+0

或者,首先获取body元素(使用任何你想要的方法 - 例如'// body'),然后通过'element.getAttribute(“class”)''检查它的类属性。 – Arran

回答

9

你似乎缺少闭合圆形和方形括号:

更改此:

//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所说,你可以使它成为owork。

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

相关问题