R通过RSelenium驱动程序环境作为函数参数

时间:2016-11-26 17:31:32

标签: r rselenium non-standard-evaluation r-environment

我可能没有看到明显的东西,无论如何我想创建自动从已经由远程驱动程序处理的URL中提取文本的函数。我希望将xpath表达式和可以找到远程驱动程序的环境作为函数参数传递

library(RSelenium)

url="http://stackoverflow.com/search?q=r+program"
remdir<-remoteDriver(remoteServerAddr = "localhost", port = 4444, browserName = "firefox")
remdir$open()
remdir$navigate(url)
env<-environment()

#env should be the environment in wich remdir exist (remdir itself?)
#xp the xpath expression to evaluate in the form "//*"
fun.XpathExtractText<-function(xp,env)
{
  cat("\ncheck if session open\n")
  #look in env for an open session
  if ((eval(quote(is.na(remdir$sessionid)),envir = env)))
    stop("ERROR NO SESSION ID open new one")
  cat("session found\n")
  #accept xpath expression as is
  xp <- substitute(xp)
  txt<-c()
  #build the call to env
  cat("calling\n")
  call<-paste0("remdir$findElements(using = \"xpath\",\"",as.character(xp),"\")")
  tgt<-eval(as.name(call),envir = env)
  cat("Target locked\n")
  txt<-lapply(tgt,function(c){c$getElementText()})
  return(txt)
}

此功能的可能调用可能是fun.XpathExtractText("//*",env)  但是在调用构建部分之后不久就会出现错误消息:

Error in eval(expr, envir, enclos) : 
 object 'remdir$findElements(using = "xpath","//*")' not found 

但如果我直接在env中执行从错误中提取的调用  消息它会起作用。

tgt<-remdir$findElements(using = "xpath","//*")

我试图通过环境也传递remdir本身,因为它是一个环境,但这根本不算,函数在调用构建后卡在同一点。 我不知道什么?

2 个答案:

答案 0 :(得分:0)

不确定您到底想要做什么。但是<div class="greeting"> <h1>Hi.</h1> <h2>Select a group</h2> </div>似乎不是答案。您应该将eval对象传递给您的函数:

remoteDriver

答案 1 :(得分:0)

抱歉,我不够清楚,无论如何我试图构建一个可以采用xpath并返回找到的元素文本的函数,我想扩展这个以获取属性值和其他东西来拥有一切进入一行命令,有机会以编程方式更改xpath。这部分是我为了解eval,替代等而做的一种练习......至少这是第一个想法。

无论如何这是有效的:

fun.XpathExtractText<-function(xp,dir)
{
  #look in env for an open session
  if (is.na(dir$sessionid))
    stop("ERROR NO SESSION ID open new one")
  #accept xpath expression as is
  xp <- substitute(xp)
  txt<-c()
  tgt<-dir$findElements(using = "xpath",xp)
  txt<-lapply(tgt,function(c){c$getElementText()})
  return(txt)
}

以dir的名称传递remoteDriver的名称。