Ruby until循环提前终止:Watir采集无限滚动页面内容遇问题
问题分析与修复方案
你的循环仅执行一次就停止,核心问题是循环内的变量赋值逻辑错误,同时滚动和等待的方式也不够可靠,具体问题和修复如下:
1. 核心逻辑错误
你在循环开始时直接将old_app_as重新赋值为当前页面的元素集合,而非继承上一次循环结束后的new_app_as值。第一次循环执行后,old_app_as和new_app_as会指向同一元素集合,导致两者数量相等,循环直接终止。
2. 修复后的代码
browser.goto 'https://bubble.io/plugins' # 初始化:获取初始条目集合 old_app_as = browser.divs(class: 'rows')[1].as loop do # 滚动到当前最后一个条目底部,触发加载 old_app_as.last.scroll.to :bottom if old_app_as.any? # 等待新元素加载,替代固定sleep更可靠 Watir::Wait.until { browser.divs(class: 'rows')[1].as.count > old_app_as.count } new_app_as = browser.divs(class: 'rows')[1].as # 数量不再增加则退出循环 break if new_app_as.count == old_app_as.count # 更新旧集合为最新值,准备下一轮循环 old_app_as = new_app_as end
3. 关键优化点
- 变量传递逻辑:每次循环结束后将
new_app_as赋值给old_app_as,确保前后数量对比有效 - 滚动方式:滚动到当前最后一个条目底部,比固定大数值更精准,避免无效滚动
- 等待方式:用Watir的
Wait.until等待元素数量增加,替代固定sleep,既节省时间又能确保元素加载完成 - 循环结构:改用
loop do...break结构,逻辑更清晰,避免初始值设置的混乱
内容的提问来源于stack exchange,提问作者kacper
相关产品推荐
相关产品推荐

