【问题标题】:How to skip an element when iterating through a list Ruby遍历列表Ruby时如何跳过元素
【发布时间】:2019-03-07 11:55:25
【问题描述】:

我有以下循环遍历元素列表的脚本:

  $browser.divs(class:'menu-index-page__menu-category').map do |cat|
  cate = cat.h3.text
  puts cate

  cc = cat.ul(class:'menu-index-page__items')
  cc.lis(class:'menu-index-page__item').each do |lit|
    lit.fire_event :click
    sleep(5)

班级列表的名称偶尔会更改为:

menu-index-page__item menu-index-page__item--unavailable

这会破坏脚本,我希望能够在它出现时跳过它并继续使用原始脚本。

【问题讨论】:

  • next if condition... 我想。

标签: ruby testing watir


【解决方案1】:

假设您使用的是 Watir v6.5+,:class 定位器支持排除类。您可以通过以下方式找到所有包含类“a”但不包含“b”的元素:

browser.elements(class: ['a', '!b'])

对于您的具体示例,您可以这样做:

cc.lis(class: ['menu-index-page__item', '!menu-index-page__item--unavailable']).each do |lit|
  # your actions on lit
end

【讨论】:

  • 我想点击 'menu-index-page__item' 并忽略/跳过 '!menu-index-page__item--unavailable' 现在它试图点击 '!menu-index-page__item --unavailable' 这会破坏脚本。
  • 这就是它的作用。它只会遍历具有“menu-index-page__item”但没有“menu-index-page__item--unavailable”的li。因此,您的点击只会出现在您想要的这些上。
  • 也许我误解了“课程列表的名称偶尔会发生变化”的说法。什么时候换班?如果是在您运行上述循环之前,则此解决方案有效。如果在您进行迭代时它发生了变化,我们将需要一个不同的解决方案。
  • 啊啊完美我没注意感叹号,效果很好。非常感谢
  • 如果此答案回答了您的问题,请接受此答案。你需要点击downvote下方的tic。
【解决方案2】:

当您使用类包含 lis 时,您必须小心,因为当您使用 menu-index-page__item 定位时,它会定位 包含 menu-index-page__item 的所有内容,因此它也会定位 menu-index-page__item menu-index-page__item--unavailable。所以尝试在这个地方形成xpath,它会起作用

$browser.divs(class: 'menu-index-page__menu-category').map do |cat|
  cate = cat.h3.text
  puts cate

  cc = cat.ul(class: 'menu-index-page__items')
  cc.lis(xpath: "//li[@class='menu-index-page__item']").each do |lit|
    lit.fire_event :click
  end
end

或者您可以通过这种方式排除特定列表

$browser.divs(class:'menu-index-page__menu-category').map do |cat|
  cate = cat.h3.text
  puts cate

  cc = cat.ul(class:'menu-index-page__items')
  cc.lis(xpath: "//li[not(@class=menu-index-page__item menu-index-page__item--unavailable')]").each do |lit|
    lit.fire_event :click
  end
end

也永远不要通过fireevent点击,因为那是javascript点击,不是selenium点击,你会错过很多点击后触发的事件。

所以执行

lit.click

【讨论】:

  • 我认为 :css 示例仍然匹配所有项目。您必须明确排除不可用的类。
  • @JustinKo 是的,你说得对,我在写的时候就想到了,我现在就把它删掉。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2017-08-21
  • 2016-01-10
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多