我的元素可以处于两种状态之一class="icon"
或class="icon active"
.
我认为这$browser.element(:class => /^icon$/).click
会单击第一个不活动的按钮,但它只会单击找到的第一个按钮,而不管它是否还包含“活动”。
正则表达式错了吗?或者更好的是,有没有一种非正则表达式的方法?
我的元素可以处于两种状态之一class="icon"
或class="icon active"
.
我认为这$browser.element(:class => /^icon$/).click
会单击第一个不活动的按钮,但它只会单击找到的第一个按钮,而不管它是否还包含“活动”。
正则表达式错了吗?或者更好的是,有没有一种非正则表达式的方法?
As mentioned in the comments, the regex you used should work in watir-webdriver. However if you need a solution that will work in both watir-classic and watir-webdriver, you will need to use find
.
b.elements.find{ |e| e.class_name == 'icon'}.click
This will only matches elements where the 'class' attribute is exactly 'icon'.
It is slower and less readable, but allows you to bypass watir-classic's method for matching classes. As seen below, watir-classic will check that the regex matches any of the element's classes.
def match_class? element, what
classes = element.class_name.split(/\s+/)
classes.any? {|clazz| what.matches(clazz)}
end
这是理论上的,我很抱歉没有时间构建一个假页面并测试它是否有效
browser.element(:class => /icon(?!active)$/).click
这在理论上是有效的(正则表达式)匹配一条类似icon
但不匹配的行icon active
,但可能有一些隐藏在类名匹配方式上的魔法,这可能会导致它返回错误的行。
如果这不起作用,请告诉我,我会建议一种替代方法,虽然不太优雅,但应该可以工作。
作为参考,我使用了Rubular在线正则表达式测试器以及这个 SO answer正则表达式来匹配不包含单词的行?对此有所了解。
如果无法使用正则表达式,另一种选择是获取匹配项目的集合,然后更仔细地检查它们,当您找到一个有效的项目时单击并在此时放弃该集合。
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