Я пытаюсь преобразовать код Java в 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 ответа

Этот код должен быть написан с лямбдами на Java (8 и выше) и Scala (2.12) для взаимодействия с интерфейсом Java Function) если у вас нет особых причин не делать этого.

Джава:

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

Scala:

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

или же

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

Также, wait должен иметь ignoring(classOf[NoSuchElementException])не Nothing,

Вот преобразование:

Преобразование "ждать"

Ява и Скала очень похожи здесь. Просто отметьте, что:

  1. Скала использует [] для дженериков вместо Java <>,
  2. Скала версия SomeClass.class является classOf[SomeClass],

Джава:

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])

Преобразование "Фу"

Это хорошее место, чтобы проиллюстрировать сходство между функциональным стилем Java и Scala. Я перевожу ваш пример в функциональный стиль в Java и использую var который был представлен в Java 10. Версия 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 следующим образом:

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

Я не говорю о том, что Selenium's FluentWait здесь. Для общего свободного API в Java это должно иметь значение по умолчанию, не так ли? В этом случае названный параметр в Scala выглядит лучше для меня. Например,

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

ignoring аргумент игнорируется и получит значение по умолчанию classOf[NoSuchElementException],

Другие вопросы по тегам