微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RSelenium:尝试如果 findElement 成功,然后单击它,错误:“类型 'S4' 的对象不是可子集的”

如何解决RSelenium:尝试如果 findElement 成功,然后单击它,错误:“类型 'S4' 的对象不是可子集的”

我正在用 RSelenium 抓取 https://www.tandfonline.com/loi/sabo20

我想点击每个 li 的文本以年份 20152021 结尾。 xpath 运行良好。

可能缺少一年(例如 2021),这就是我使用 try() 方法的原因。

  URL <- "https://www.tandfonline.com/loi/sabo20"

  # open RSelenium
  rD <- RSelenium::rsDriver(browser = "chrome",chromever = "90.0.4430.24",port = 4546L,verbose = F)

  remDr <- rD[["client"]]
  remDr$navigate(URL)
  Sys.sleep(4)

  for (yyyy in c(2015:2021)) {
    error <- "Error : \t Summary: NoSuchElement\n \t Detail: An element Could not be located on the page using the given search parameters.\n \t class: org.openqa.selenium.NoSuchElementException\n\t Further Details: run errorDetails method\n"

    volumes <- try(unlist(
      remDr$findElement(
        using = "xpath",paste0(
          "//li[substring(@id,string-length(@id) - string-length('",yyyy,"') +1) = '","']/div"
        )
      )
    ))
    
      if(volumes[1] == error)
        break;
    
    volumes$clickElement()
  }

不幸的是,如果 if(volumes[1] == error) 成功,findElement() 会导致错误

错误[1]:“S4”类型的对象不可子集

在我remDr$findElement()之前如何检查clickElement()是否成功?

解决方法

解决方案可能是trycatch

下面是一个例子。

URL <- "https://www.tandfonline.com/loi/sabo20"

# open RSelenium
rD <- RSelenium::rsDriver(browser = "chrome",chromever = "90.0.4430.24",port = 4546L,verbose = F)

remDr <- rD[["client"]]
remDr$navigate(URL)
Sys.sleep(4)

for (yyyy in c(1983:2021)) {
tryCatch(expr = {   
  volumes <- unlist(
    remDr$findElement(
      using = "xpath",paste0(
        "//li[substring(@id,string-length(@id) - string-length('",yyyy,"') +1) = '","']/div"
      )
    )
  )
  volumes$clickElement()
  Sys.sleep(4)
  },error =function(e){          
    message("if you want you can break,but it not necessary")
  })
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。