Я пытаюсь преобразовать код Java в Scala - PullRequest
0 голосов
/ 21 января 2019

Я хочу использовать свободное ожидание с селеном в скале.Однако я не могу преобразовать приведенный ниже код в 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 голосов
/ 21 января 2019

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

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

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

0 голосов
/ 21 января 2019

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

Преобразование "wait"

Здесь 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 ииспользуя 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 _ canиспользоваться вместо явного имени параметра в вызове функции.Это выбор стиля, но вы также можете написать приведенный выше код Scala следующим образом:

val foo = wait.until(_.findElement(By.id("foo")))
0 голосов
/ 21 января 2019

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

Java:

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.

...