使用apply循环时rselenium驱动程序错误

时间:2016-10-28 20:31:27

标签: r selenium runtime-error rselenium

我正在使用rselenium在Firefox中自动执行页面导航。我的rscript为不同的条件导入数据框并创建一个自定义函数,然后使用apply命令调用该函数。在函数中,每列都通过以下方式引用:

#create the function
example <- function(dat) {
    webElem$sendKeysToElement(list(dat[[column1]]))
    #Enters text from the column in the web driver
}
apply(df, 1, example) #Should repeat the function for each row of the data

我在apply函数中引用了多个列,以便每个列的数据可以为Web驱动程序提供不同的交互 - 例如dat[[column2]]dat[[column3]]等等上。大多数情况下,我只是发送密钥(findElement(using = 'tag name', 'body')之后的标签和箭头键,或者点击我使用findElement函数及其ID找到的按钮。

我有脚本执行,它第一次运行正常,但当它重新开始时我得到错误。我希望selenium再次打开起始URL,并使用数据框的下一行重复导航。但是,发生了什么是r锁定或报告错误:

Error:   Summary: NoSuchDriver
     Detail: A session is either terminated or not started
     class: org.openqa.selenium.NoSuchSessionException
     Further Details: run errorDetails method

我认为它会追溯到函数开头的findElements次调用或sendKeysToElement调用。我试过关闭,退出和重新初始化远程驱动程序,但它似乎没有什么区别。有任何疑难解答提示吗?或者在r?

中用selenium重复导航的好方法

1 个答案:

答案 0 :(得分:1)

我能够通过将我的代码从apply函数重新转换为for(...)循环来解决这个问题。我创建的功能发生了微小的变化。

  • 我在循环开始时启动了Web驱动程序

    remDr <- remoteDriver(extraCapabilities = list(marionette = TRUE))       
    remDr$open(silent = TRUE)
    remDr$navigate(url)
    
  • 在整个循环过程中,我小心翼翼地将变量传递给依赖于rselenium的方法,如findElementsendKeysToElement。看起来像这样:

    nextBtn(pageBody, remDr)
    

    这是简写:

    nextBtn <- function(element=pageBody, driver=remDr) {
      Sys.sleep(.5)
      driver$findElement(using = 'id',value = "NextButton")$clickElement()
      Sys.sleep(2.5)
    }
    

    我认为因为这些方法是在单独的函数中调用的,所以它们需要指向正确的驱动程序元素(即使我曾尝试设置默认值)

  • for循环结束时,代码关闭了网络驱动程序:

    remDr$close()
    remDr$quit()
    

循环的实际调用是

for (i in 1:nrow(df)) {
  surveys(df[i,])
}

最终结果是循环功能。它每次都会打开一个新的驱动程序实例,但没有错误。仍然使用df[[mold0to2]]对特定列进行了引用。