找出类名是不是包含某些文本
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)