RSelenium: щелчок по ссылке внутри другой ссылки

У меня есть этот RSelenium скрипт:

library(tidyverse)
library(RSelenium) # running through docker
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 = "xpath",
                               "//h3[@class = 'LC20lb']//parent::a")

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

Вышеупомянутое щелкает по каждой ссылке в результатах поиска Google (их 10 на странице). Книги, которые я ищу, в основном имеют предварительный просмотр, когда вы нажимаете на них. Если есть предварительный просмотр, есть небольшая ссылка About this book, по которой можно щелкнуть, чтобы перейти к информации о публикации.

Я хочу нажать на первые ссылки, а затем, если есть предварительный просмотр, нажать «Об этой книге». У меня есть ниже, но я просто получаю Error: object of type 'closure' is not subsettable ошибки:

for(link in links) {

  # Navigate to each link
  remDr$navigate(link)

  # If statement to get past book previews
  if (str_detect(link, "frontcover")) {

   link2 <- remDr$findElement(using = 'xpath', 
                               '//*[@id="sidebar-atblink"]//parent::a')
   link2 <- as.list(link2)
   print(class(link2))
   link2_about <- sapply(link2, function(ugh){
      ugh$getElementAttribute('href')
    })

  } else {
    print("nice going, dumbass")
  }
}

Или я пробую цикл for вместо sapply, я получаю Error: $ operator is invalid for atomic vectors:

for(link in links) {

  # Navigate to each link
  remDr$navigate(link)

  # If statement to get past book previews
  if (str_detect(link, "frontcover")) {

    link2 <- remDr$findElement(using = 'xpath',
       '//a[@id="sidebar-atb-link" and span[.="About this book"]]')

     for(i in length(link2)){
      i$getElementAttribute('href')
     }

    } else {
     print("dumbass")
   }
}

Как я могу успешно нажать на эту вторую ссылку, в зависимости от того, есть ли предварительный просмотр? Спасибо!


person papelr    schedule 22.03.2019    source источник


Ответы (1)


Просто обновите строку ниже.

aboutLinks <- remDr$findElements(using = 'xpath', 
                           '//a[@id="sidebar-atb-link" and span[.="About this book"]]')
links2 <- sapply(aboutLinks, function(about_link){
  about_link$getElementAttribute('href')
})
person supputuri    schedule 22.03.2019
comment
К сожалению, все еще получаю эту запутанную ошибку Error: object of type 'closure' is not subsettable. Должно быть что-то делать со следующей функцией sapply? Например, ваши элементы определенно верны, но что-то после этого не работает. - person papelr; 22.03.2019
comment
link2 <- as.list(link2) зачем ты это делаешь? - person supputuri; 22.03.2019
comment
Я где-то читал, что это могло дать мне эту ошибку ... но кто знает. Одна и та же ошибка в любом случае - person papelr; 22.03.2019
comment
Готово - та же ошибка. Может моя машина? Хотя, если я закомментирую часть sapply и print(link2), будет напечатано правильное количество ссылок. Просто sapply выдает эту подустанавливаемую ошибку - person papelr; 22.03.2019
comment
Ок, разобрался с вопросом. Мы пропустили ссылки s' while getting the Об этой книге. мы должны передавать элементы в sapply, а не элемент. - person supputuri; 22.03.2019