我的元素可以是两种状态class="icon"
或class="icon active"
中的一种。
我认为$browser.element(:class => /^icon$/).click
会点击第一个未激活的按钮,但它只是点击它找到的第一个按钮,无论它是否还包含“有效”。
正则表达式错了吗?或者更好的是,有没有正则表达方式吗?
答案 0 :(得分:3)
这是理论上的,我为没有时间构建虚假页面并测试它是否有效而道歉
browser.element(:class => /icon(?!active)$/).click
这在理论上(正则表达式)匹配像icon
但不是icon active
这样的行,但是,可能会有一些引人注目的魔法继续如何匹配类名,这可能会导致它返回错误的一行。
如果这不起作用,让我知道,我会建议一种替代方法,虽然不那么优雅,但应该有效。
作为参考,我使用了Rubular在线正则表达式测试程序以及此SO回答Regular expression to match a line that doesn't contain a word?。
答案 1 :(得分:3)
正如评论中所提到的,你使用的正则表达式应该在watir-webdriver中工作。但是,如果您需要一个既适用于watir-classic又适用于watir-webdriver的解决方案,则需要使用find
。
b.elements.find{ |e| e.class_name == 'icon'}.click
这只会匹配'class'属性正好是'icon'的元素。
速度较慢且可读性较差,但允许您绕过watir-classic的匹配类的方法。如下所示,watir-classic将检查正则表达式是否匹配任何元素的类。
def match_class? element, what
classes = element.class_name.split(/\s+/)
classes.any? {|clazz| what.matches(clazz)}
end
答案 2 :(得分:1)
无法使用正则表达式,另一种选择是获取匹配项的集合,然后更仔细地检查它们,在找到有效项并在此时放弃集合时单击。
browswer.elements(:class => "icon").each do |possible|
unless possible.attribute_value("class").include? "active"
possible.click
break
end
end
我并不总是unless
的忠实粉丝,但在这种情况下会导致代码可读,所以我用它
进行疑难解答,让我们看一下该集合中元素的类信息显示内容
browswer.elements(:class => "icon").each do |possible|
puts possible.attribute_value("class")
end