如何在遍历列表时跳过元素 Ruby

How to skip an element when iterating through a list Ruby

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

  $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)

有时 class 列表的名称会更改为:

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

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

当您使用 class 包含 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

假设您使用的是 Watir v6.5+,:class 定位器支持排除 classes。您可以找到包含 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