找出类名是否包含某些文本
作为我测试的一部分,系统应该查明用于打开网站的设备是移动设备还是普通桌面。
我一直收到错误:
“InvalidSelectorError:无法找到带有xpath表达式的元素// * [contains(@class,is-mobile …”
萤火虫的财产:
我的测试:
public class isMobile { public static boolean isMobile = false; public static boolean checkIfMobile(WebDriver driver) throws Exception { List list = driver.findElements(By .xpath("//body[contains(@class, 'is-mobile'")); if (list == null) { return false; } else { return true; } } }
有人可以告诉我正确的XPath应该如何?
你似乎错过了收盘和方括号:
改变这个:
//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的做法。
这是使用错误工具的一个很好的例子。 HTML设计者错误的一个原因是使用单个字符串属性来编码多个值。 不幸的是,至少有一个可用的数组结构的XPath设计者无法解决这个错误。 因此,不要使用XPath,尽管如Mosty Mostacho所说,你可以把它变成owork。
CSS设计师做得更好。 虽然他们没有做类似数组的事情,但他们至少将class
提升到一个简单的字符串之上。 使用By.cssSelector('body.is-mobile')
– 它正确使用CSS定位器。