通过R包rJava在类org.openqa.selenium.remote.RemoteWebElement的对象上调用sendKeys时的NoSuchMethodException

时间:2018-02-10 23:12:58

标签: r selenium selenium-webdriver rjava

我正在尝试使用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而不是CharSequenceRemoteWebElement而不是WebElement等,但没有快乐。

我怀疑这是rJava的问题,但我仍然难过,需要帮助!

1 个答案:

答案 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"))

你知道的越多......