R передает RSelenium драйвер среды в качестве аргумента функции
Я, вероятно, не вижу ничего очевидного, в любом случае я хотел бы создать функции для автоматического извлечения текста из URL, уже обработанного удаленным драйвером. Я хотел бы передать в качестве аргументов функции выражение xpath и среду, в которой можно найти удаленный драйвер
library(RSelenium)
url="http://stackru.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 ответа
Не уверен, что именно ты пытаешься сделать. тем не мение eval
не кажется ответом. Вы должны пройти remoteDriver
возьмите в свою функцию:
library(RSelenium)
url="http://stackru.com/search?q=r+program"
remdir<-remoteDriver(remoteServerAddr = "localhost", port = 4444, browserName = "firefox")
remdir$open()
remdir$navigate(url)
fun.XpathExtractText<-function(xp, remdir)
{
cat("\ncheck if session open\n")
#look in env for an open session
if (is.na(remdir$sessionid))
stop("ERROR NO SESSION ID open new one")
cat("session found\n")
#accept xpath expression as is
cat("calling\n")
tgt <- remdir$findElements(using = "xpath",as.character(xp))
cat("Target locked\n")
txt<-lapply(tgt,function(c){c$getElementText()})
return(txt)
}
Извините, я не был достаточно ясен, в любом случае я пытался создать функцию, которая могла бы принимать 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 имя удаленного драйвера.