RSelenium:单击 Google 搜索中 for 循环中的后续链接

RSelenium: clicking on subsequent links in for loop from a Google search

我正在使用 RSelenium 进行一些简单的 Google 搜索。设置:

library(tidyverse)
library(RSelenium) # running docker to do this
library(rvest)
library(httr)

remDr <- remoteDriver(port = 4445L, browserName = "chrome")
remDr$open()

remDr$navigate("https://books.google.com/")
books <- remDr$findElement(using = "css", "[name = 'q']")

books$sendKeysToElement(list("NHL teams", key = "enter"))

bookElem <- remDr$findElements(using = "css", "h3.LC20lb")

这是简单的部分。现在,第一页上有 10 个 link,我想点击每个 link,退出,然后 clink 下一个 link. 最有效的方法是什么?我尝试了以下方法:

bookElem$clickElement() 

Returns Error: attempt to apply non-function - 我预计这会点击第一个 link,但效果不佳。 (如果我从 findElements() 中取出 s - 上面的,而不是下面的 for 循环,这将起作用。

clack <- lapply(bookElem, function(y) {

   y$clickElement()
   y$goBack() 

})

产生错误,有点像 like this question

 Error:      Summary: StaleElementReference
             Detail: An element command failed because the referenced element is no longer attached to the DOM.
             Further Details: run errorDetails method 

会不会是easier to uservest,在RSelenium之内?

我认为您可以考虑抓住 link 并在不返回主页的情况下循环浏览它们。

为此,您必须获取 link 个元素 ("a tag")。

bookElems <- remDr$findElements(using = "xpath",
                                "//h3[@class = 'LC20lb']//parent::a")

然后提取 "href" 属性并导航到该属性:

links <- sapply(bookElems, function(bookElem){
  bookElem$getElementAttribute("href")
})

for(link in links){
  remDr$navigate(link)
  # DO SOMETHING
}

完整代码如下:

remDr$open()

remDr$navigate("https://books.google.com/")
books <- remDr$findElement(using = "css", "[name = 'q']")

books$sendKeysToElement(list("NHL teams", key = "enter"))
bookElems <- remDr$findElements(using = "xpath",
                                "//h3[@class = 'LC20lb']//parent::a")

links <- sapply(bookElems, function(bookElem){
  bookElem$getElementAttribute("href")
})

for(link in links){
  remDr$navigate(link)
  # DO SOMETHING
}