如何单击一个类中的链接

时间:2013-04-15 15:52:36

标签: regex watir watir-webdriver

我的元素可以是两种状态class="icon"class="icon active"中的一种。

我认为$browser.element(:class => /^icon$/).click会点击第一个未激活的按钮,但它只是点击它找到的第一个按钮,无论它是否还包含“有效”。

正则表达式错了吗?或者更好的是,有没有正则表达方式吗?

3 个答案:

答案 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