RSelenium 中的 If 语句

If-statement in RSelenium

我有大量化学品需要提取 CAS 编号。我写了一个按预期工作的 for 循环。但是,当在网站上找不到化学名称时,我的代码显然停止了。

有没有办法在 for 循环中解决这个问题?这样当找不到搜索查询时,循环会返回到起始页并搜索列表中的下一项?

下面是我的 for 循环代码,其中包含要搜索的简短名称列表:

library(RSelenium)
library(netstat)

# start the server

rs_driver_object <- rsDriver(browser = "firefox",
                             verbose = FALSE,
                             port = 4847L) # change number if port is not open

# create a client object
remDrCh <- rs_driver_object$client

items <- c("MCPA", "DEET", "apple")
numbers <- list()
for (i in items) {
  Sys.sleep(2)
  remDrCh$navigate("https://commonchemistry.cas.org/")
  search_box <- remDrCh$findElement(using = 'class', 'search-input')
  search_box$sendKeysToElement(list(paste(i), key = 'enter'))
  Sys.sleep(2)
  result <- remDrCh$findElement(using = "class", "result-content")
  result$clickElement()
  Sys.sleep(2)
  cas <- remDrCh$findElements(using = 'class', 'cas-registry-number')
  cas_n <- lapply(cas, function (x) x$getElementText()) 
  numbers[[i]] <- unlist(cas_n)
  Sys.sleep(2)
  remDrCh$navigate("https://commonchemistry.cas.org/")
  Sys.sleep(2)
}

问题出在result <- remDrCh$findElement(using = "class", "result-content")部分。对于“apple”没有结果,因此没有 R 可以使用的元素。

我试图为该特定部分编写一个单独的 if else 参数,但无济于事。 这仍然只适用于产生结果的查询。我也尝试使用 findElements 但这只对找不到结果的情况有帮助。

result <- remDrCh$findElement(using = "class", "result-content")
if (length(result) > 0) {
  result$clickElement()
} else {
  remDrCh$navigate("https://commonchemistry.cas.org/")
}

我也尝试过使用这个 但我无法在我的示例中使用它。

如有任何帮助,我们将不胜感激!

这应该有效

items <- c("MCPA", "apple", "DEET")
numbers <- list()
for (i in items) {
  Sys.sleep(2)
  remDrCh$navigate("https://commonchemistry.cas.org/")
  search_box <- remDrCh$findElement(using = 'class', 'search-input')
  search_box$sendKeysToElement(list(paste(i), key = 'enter'))
  Sys.sleep(2)
  result <- try(remDrCh$findElement(using = "class", "result-content"))
  if(!inherits(result, "try-error")){
  result$clickElement()
  Sys.sleep(2)
  cas <- remDrCh$findElements(using = 'class', 'cas-registry-number')
  cas_n <- lapply(cas, function (x) x$getElementText()) 
  numbers[[i]] <- unlist(cas_n)
  }else{
    numbers[[i]] <- NA
  }
  Sys.sleep(2)
  remDrCh$navigate("https://commonchemistry.cas.org/")
  Sys.sleep(2)
}

注意问题代码周围的 try() 包装器:

  result <- try(remDrCh$findElement(using = "class", "result-content"))

如果有错误,这将捕获错误,但允许循环继续。然后,如果 try 的输出不是 class "try-error",则有一个 if 语句试图找到结果,否则,它将 returns 数字作为NA.