You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RSelenium遍历多页面遇StaleElementReference错误,如何解决?

解决RSelenium翻页的StaleElementReference错误并遍历所有页面

错误原因

你遇到的StaleElementReference错误,是因为提前定位了下一页按钮,点击跳转后页面DOM结构刷新,原来的按钮元素已从当前DOM中移除,导致之前保存的元素引用失效。

修复方案

核心思路是每次翻页后重新定位下一页按钮,同时加入等待逻辑确保元素加载完成,循环执行直到没有下一页按钮为止。以下是修改后的代码:

library(RSelenium)
library(netstat)

# 初始化驱动
rs_driver_obj <- rsDriver(browser = "chrome",
                          chromever = "126.0.6478.126",
                          verbose = FALSE,
                          port = free_port())
remDr <- rs_driver_obj$client
remDr$open()
remDr$navigate("https://www.immobiliare.it/vendita-case/belluno-provincia/?criterio=rilevanza")

# 循环遍历所有页面
repeat {
  # --- 在此添加提取当前页面数据的代码 ---
  
  # 滚动到页面底部,确保分页按钮加载完成
  remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);")
  # 等待页面元素加载(可根据网络情况调整时长)
  Sys.sleep(2)
  
  tryCatch({
    # 精准定位"下一页"按钮(匹配意大利语"Prossima"文本,避免误抓其他分页按钮)
    next_button <- remDr$findElement(using = "xpath", "//a[contains(@class,'in-pagination__item') and text()='Prossima']")
    
    # 检查按钮是否可点击,避免最后一页的禁用按钮
    if (next_button$isElementEnabled()) {
      next_button$clickElement()
      # 等待页面跳转完成
      Sys.sleep(3)
    } else {
      # 按钮不可点击,说明已到最后一页,退出循环
      break
    }
  }, error = function(e) {
    # 捕获找不到按钮的错误,退出循环
    message("已到达最后一页或无法定位下一页按钮:", e$message)
    break
  })
}

# 关闭驱动
remDr$close()
rs_driver_obj$server$stop()

关键优化点

  • 循环内重新定位按钮:避免页面刷新后元素引用失效的问题。
  • 精准定位按钮:通过文本Prossima(意大利语“下一页”)缩小定位范围,避免误匹配上一页或页码按钮。
  • 边界处理:用tryCatch捕获异常,同时检查按钮可用性,确保最后一页正常退出循环。
  • 添加等待逻辑:页面滚动和跳转后设置等待时间,避免因元素未加载完成导致的操作失败。

内容的提问来源于stack exchange,提问作者crossgamma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:25:12