【问题标题】:Watir-WebDriver: Find elements which class is not 'completed'Watir-WebDriver:查找未“完成”类的元素
【发布时间】:2012-03-13 22:26:10
【问题描述】:

我有一堆li 元素。它们要么有 uncompleted、'current' 或 completed 类,要么没有类。

如何找到所有没有completed 类的li 元素?

到目前为止,我通过从li 的集合中选择必要的li 对象来做到这一点(通过调用#attribute_value('class'),但Watir-WebDriver 中可能有一些优雅的定位策略?

UPD:只要对问题有一些误解。

我想知道 Watir-WebDriver 中是否有定位策略来查找哪个类不是completed 的元素。

我知道我可以用 Ruby 做到这一点,并这样做:

browser.lis.select do |li|
  li.attribute_value('class') != 'completed'
end

但问题是我是否可以通过将一些参数传递给#lis 来在一行中做到这一点

UPD2:刚刚意识到给定的类名会缩小解决方案的范围。更新了问题,对此深表歉意。

【问题讨论】:

  • 您的解决方案对我来说已经足够好了。我不知道直接通过 webdriver 做这种事情的方法,但我不是这方面的专家。

标签: watir watir-webdriver


【解决方案1】:

LI 集合支持定位器,这意味着您可以:

browser.lis(:class, 'uncompleted').each{ |x|
    puts x.text
}

更新:对于有多个类的情况,可以修改上面使用正则表达式检查未完成:

browser.lis(:class, /^(?!completed$)/).each{ |x| puts x.class_name }

这将返回所有没有类或未完全“完成”(例如“完成2”)的li

注意:我认为.class_name 可能比attribute_value('class') 有更好的支持(我认为它在 IE 中不起作用,因为它需要是 className)。

【讨论】:

  • 这假设只有 li 类是“已完成”和“未完成”(这可能是准确的,但可能不是)。
  • 看起来正则表达式不正确'completed' =~ /^(?!completed$)/ #=> nil。但是,我知道有一种方法可以做到这一点,谢谢!
  • 在这种情况下nil 很好,因为这意味着它不会被包含在集合中。
【解决方案2】:

为了不假设只有两类数组,你可以这样做:

    all = browser.lis.collect { |li| li.class }
    completed = browser.lis(:class, 'completed').collect { |li| li.class }

    not_completed = (all - completed)

甚至:

all = browser.lis.collect { |li| li.class }
not_completed = Array.new

all.each do |li|
    if li.class != "completed"
       not_completed << li
    end
end

【讨论】:

  • 我知道这样的解决方案,但我一直在寻找 watir-webdriver 内置解决方案(如果存在)。更新了问题。
  • 我认为这些实际上应该是li.class_name 而不是li.classli.class 将返回 Watir::LI 而不是“完成”、“未完成”等。
  • 我认为现在所有建议的解决方案都更基于 ruby​​。您只是在寻找单线(强调 Webdriver 原生解决方案),还是有其他原因需要非 Ruby 解决方案?
  • 我想要本地解决方案,看起来正则表达式在那里有帮助。不过感谢您的回答!
猜你喜欢
  • 2013-10-08
  • 2015-11-07
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多