我正在使用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?
答案 0 :(得分:1)
我能够通过将我的代码从apply
函数重新转换为for(...)
循环来解决这个问题。我创建的功能发生了微小的变化。
我在循环开始时启动了Web驱动程序
remDr <- remoteDriver(extraCapabilities = list(marionette = TRUE))
remDr$open(silent = TRUE)
remDr$navigate(url)
在整个循环过程中,我小心翼翼地将变量传递给依赖于rselenium
的方法,如findElement
和sendKeysToElement
。看起来像这样:
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]]
对特定列进行了引用。