Я пытаюсь преобразовать код 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
,
Вот преобразование:
Преобразование "ждать"
Ява и Скала очень похожи здесь. Просто отметьте, что:
- Скала использует
[]
для дженериков вместо Java<>
, - Скала версия
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]
,