如何在遍历列表时跳过元素 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
我有以下循环遍历元素列表的脚本:
$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