Как пропустить элемент при переборе списка Ruby - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующий скрипт, который перебирает список элементов:

  $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

Это ломает скрипт, и я хочу иметь возможность пропустить это всякий раз, когда он подходит и продолжить с оригинальным сценарием.

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Предполагая, что вы используете 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
0 голосов
/ 02 октября 2018

Когда вы включаете класс lis using, вы должны быть осторожны, потому что, когда вы находите с помощью 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, это не клик по селену, вам будет не хватать многих событий, которые будут срабатывать после клика.

Выполните

lit.click
...