我正在尝试使用rJava直接从R使用selenium webdriver API。我受制于一个相当严格的IT环境,因此我目前无法访问远程驱动程序(因此我目前没有使用Rselenium软件包),而且我没有Chrome或Firefox可用 - 只是幻像。我可以从Scala REPL中获得这个工作正常。我使用sbt来获取所有依赖项 - build.sbt
包含,例如:
retrieveManaged := true
libraryDependencies ++= Seq (
"org.seleniumhq.selenium" % "selenium-java" % "3.9.1",
"com.codeborne" % "phantomjsdriver" % "1.4.4"
)
(请注意,我将phantomjs安装为/usr/local/bin/phantomjs
,它是
版本2.1.1)。
然后我通过cp jars/*/*/*.jar alljars/
将所有jar文件复制到单级文件夹中,其中包含以下内容:
animal-sniffer-annotations-1.14.jar httpcore-4.4.6.jar selenium-api-3.9.1.jar
byte-buddy-1.7.9.jar j2objc-annotations-1.1.jar selenium-chrome-driver-3.9.1.jar
checker-compat-qual-2.0.0.jar jline-2.14.5.jar selenium-edge-driver-3.9.1.jar
commons-codec-1.10.jar jsr305-1.3.9.jar selenium-firefox-driver-3.9.1.jar
commons-exec-1.3.jar okhttp-3.9.1.jar selenium-ie-driver-3.9.1.jar
commons-logging-1.2.jar okio-1.13.0.jar selenium-java-3.9.1.jar
error_prone_annotations-2.1.3.jar phantomjsdriver-1.4.4.jar selenium-opera-driver-3.9.1.jar
gson-2.8.2.jar scala-compiler-2.12.4.jar selenium-remote-driver-3.9.1.jar
guava-23.6-jre.jar scala-library-2.12.4.jar selenium-safari-driver-3.9.1.jar
httpclient-4.5.3.jar scala-reflect-2.12.4.jar selenium-support-3.9.1.jar
我通过scala -cp "alljars/*"
启动Scala,可以执行以下操作:
val drv = new org.openqa.selenium.phantomjs.PhantomJSDriver
drv.get("https://www.google.com")
val q = drv.findElementByName("q")
q.sendKeys("rJava selenium")
q.submit
drv.getTitle
我认为以下在R中使用rJava大致相同:
library(rJava)
.jinit()
jars <- dir("alljars", pattern = "*.jar", full.names = TRUE)
.jaddClassPath(jars)
drv <- .jnew('org/openqa/selenium/phantomjs/PhantomJSDriver')
drv$get("https://www.google.com")
q <- drv$findElementByName("q")
q$sendKeys("rJava selenium")
q$submit()
drv$getTitle()
在q$sendKeys("rJava selenium")
点失败并出现以下错误:
Error in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, :
java.lang.NoSuchMethodException: No suitable method for the given parameters
在RStudio中,如果我输入q$
并按TAB,sendKeys
肯定在可用方法列表中。我试图明确这一点,并尝试:
keys <- .jnew("java/lang/String", "rJava selenium")
keys <- .jcast(keys, "java/lang/CharSequence", check = TRUE)
q <- .jcast(q, "org/openqa/selenium/WebElement", check = TRUE)
.jcall(q, "V", "sendKeys", keys)
导致以下错误:
Error in .jcall(q, "V", "sendKeys", keys) :
method sendKeys with signature (Ljava/lang/CharSequence;)V not found
q
在R中有org/openqa/selenium/remote/RemoteWebElement
个类,在Scala中有org/openqa/selenium/WebElement
;但在两种情况下,根据javadoc,返回值为void
,所需参数为CharSequence
。我尝试了一些变体 - java.lang.String
而不是CharSequence
,RemoteWebElement
而不是WebElement
等,但没有快乐。
我怀疑这是rJava
的问题,但我仍然难过,需要帮助!
答案 0 :(得分:0)
.jmethods
。运行这个:
> .jmethods(q, "sendKeys")
[1] "public void org.openqa.selenium.remote.RemoteWebElement.sendKeys(java.lang.CharSequence[])"
所以,基本上,我的问题是我传递了String
而不是String[]
。也就是说,而不是:
q$sendKeys("rJava selenium")
我可以使用:
q$sendKeys(.jarray("rJava selenium"))
你知道的越多......