Ruby直到循环结束得太快

wfveoks0  于 2022-10-15  发布在  Ruby
关注(0)|答案(1)|浏览(118)

我正在使用Watir从一个无限滚动的页面中收集所有项目。创建了一个Until循环,该循环计算处于“BEFORE”状态的项目数,滚动到页面底部并计算新的项目数。
它应该运行,直到所有项目都被捕获,但它只在一个滚动后停止。
我做错了什么?

browser.goto 'https://bubble.io/plugins'
old_app_as = ['a']
new_app_as = ['b', 'c']

until old_app_as.count == new_app_as.count
  old_app_as = browser.divs(class: 'rows')[1].as
  browser.scroll.to [0, 999999999]
  sleep(10)
  new_app_as = browser.divs(class: 'rows')[1].as
end
acruukt9

acruukt91#

问题是在使用Enumerable方法时,ElementCollections会重新定位元素。您可以在Watir代码中看到这一点:

def each(&blk)
  reset!
  to_a.each(&blk)
end

这意味着在until old_app_as.count == new_app_as.count中:
1.old_app_as将重新定位集合查找当前可用的链接,它将找到40个链接(即具有额外加载的页面)。
1.new_app_as还将重新定位当前可用的链接,它将找到相同的40个链接。
1.这两个值相同,因此循环退出。
您需要以不会每次都重新定位的方式存储old_app_asnew_app_as。我认为最简单的解决方案是使用#to_a将它们转换为Array

until old_app_as.count == new_app_as.count
  old_app_as = browser.divs(class: 'rows')[1].as.to_a
  browser.scroll.to [0, 999999999]
  sleep(10)
  new_app_as = browser.divs(class: 'rows')[1].as.to_a
end

相关问题