RSelenium:通过单击加载更多按钮加载页面:如果网络元素消失,则停止循环

RSelenium: Load a page by clicking on load more button: stop the loop if the webelement is gone

我想用 RSelenium 抓取以下页面:https://www.letempsarchives.ch/recherche?q=%22Willy+Spuehler%22#

在抓取页面之前,我需要加载网页上的所有搜索结果。为此,我必须单击“Voir plus des resultats...”按钮,直到该按钮不再可见并且所有搜索结果都已加载。我试着写一个 while-loop 如下:

library(RSelenium)
rD <- rsDriver(browser = "chrome", chromever = "87.0.4280.88", port = 4568L)
url <- "https://www.letempsarchives.ch/recherche?q=%22Willy+Spuehler%22#"
remote_driver <- rD[["client"]] 
remote_driver$navigate(url)

chk <- FALSE
  while(!chk){
    loadmore <- remote_driver$findElement("xpath", "//*[@class='ui fluid button huge loadMore']")
    if(length(loadmore) > 0L){
      loadmore$clickElement()
      Sys.sleep(5)
    }else
      chk <- TRUE
  }

通过这种方式我加载了所有搜索结果,但循环停止并出现以下错误:

Selenium message:stale element reference: element is not attached to the page document

加载每个搜索结果后加载更多按钮消失,这正是我所需要的,但我还需要循环停止而不会出现错误,以便稍后我的代码可以继续。我从 那里得到了灵感。 非常感谢任何帮助。

编辑:我在此处复制的代码中犯了一个错误,现在进行了更改。 (对不起!)但我还是犯了同样的错误..

为什么不添加简单的错误处理程序? loadmore <- try(remote_driver$findElement("xpath", "//*[@class='ui fluid button huge loadMore']")) 如果出现错误,loadmore 将不再是整数

在这个 post and this 的帮助下,我可以不停地让我的代码达到 运行。出于某种原因,如果未显示该元素,isElementDisplayed() 会给我一个错误,而不是 FALSE。但是对于 tryCatch()suppressMessages() 它 运行s。这肯定不是最优雅的解决方案,但它确实有效。

  tryCatch({
    Sys.sleep(5)
    suppressMessages({
      loadmore <- remote_driver$findElement("xpath", "//*[@class='ui fluid button huge loadMore']")
      while(loadmore$isElementDisplayed()[[1]]){
        loadmore$clickElement()  
        Sys.sleep(10)
        loadmore <- remote_driver$findElement("xpath", "//*[@class='ui fluid button huge loadMore']")
        
      }
    })
  }, 
  error = function(e) {
    NA_character_
  }
  )