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_
}
)
我想用 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_
}
)