我正在尝试将Java代码转换为Scala

时间:2019-01-21 04:53:34

标签: scala selenium-chromedriver fluentwait

我想在scala中对硒使用流利的等待。但是我无法将以下代码转换为Scala。请帮帮我。

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
        .withTimeout(30, SECONDS)
        .pollingEvery(5, SECONDS)
        .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() 
{
  public WebElement apply(WebDriver driver) {
  return driver.findElement(By.id("foo"));
}
});

在Scala中使用它时,我会得到

@BrianMcCutchon-嗨。当我在Scala中使用此代码时,它会转换为以下代码,

val wait = new FluentWait[WebDriver](driver).withTimeout(30, SECONDS).pollingEvery(5, SECONDS).ignoring(classOf[Nothing])

  val foo = wait.until(new Nothing() {
    def apply(driver: WebDriver): WebElement = driver.findElement(By.id("foo"))
  })

在此代码中,无法解决val wait。而且,什么都没有意义

3 个答案:

答案 0 :(得分:1)

除非有特殊原因,否则此代码应在Java(8和更高版本)和Scala(2.12)中使用lambda编写,以便与Java接口Function互操作。

Java:

WebElement foo = wait.until(driver -> driver.findElement(By.id("foo")));

斯卡拉:

val foo = wait.until(_.findElement(By.id("foo")))

val foo = wait.until(driver => driver.findElement(By.id("foo")))

此外,wait应该有ignoring(classOf[NoSuchElementException]),而不是Nothing

答案 1 :(得分:0)

我在这里不是在谈论Selenium的FluentWait。对于Java中的通用fluent api,它应该具有默认值,不是吗?在这种情况下,Scala中的命名参数对我来说看起来更好。例如,

new FluentWait(timeout = 30.seconds, polling = 5.seconds)

ignoring参数将被忽略,并将获得默认值classOf[NoSuchElementException]

答案 2 :(得分:0)

以下是转换:

转换“等待”

Java和Scala在这里非常相似。请注意:

  1. Scala将[]用作泛型,而不是Java的<>
  2. Scala的SomeClass.class版本为classOf[SomeClass]

Java:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
    .withTimeout(30, SECONDS)
    .pollingEvery(5, SECONDS)
    .ignoring(NoSuchElementException.class);

scala:

val wait = new FluentWait[WebDriver](driver)
    .withTimeout(30, SECONDS)
    .pollingEvery(5, SECONDS)
    .ignoring(classOf[NoSuchElementException])

转换“ foo”

这是说明函数式Java与Scala之间相似之处的好地方。我正在将您的示例转换为Java中的函数式,并使用Java 10中引入的var。Scala版本是非常相似。

您的Java:

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
  public WebElement apply(WebDriver driver) {
    return driver.findElement(By.id("foo"));
  }
});

具有本地类型推断功能的Java(JDK 10 +):

var foo = wait.until(driver -> driver.findElement(By.id("foo")));

scala:

val foo = wait.until(driver => driver.findElement(By.id("foo")))

在Scala中,可以使用_代替函数调用中的显式参数名称。这是一种样式选择,但是您也可以将上面的Scala代码编写为:

val foo = wait.until(_.findElement(By.id("foo")))