我想在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 等待。此外,没有什么似乎毫无意义
此代码应该在 Java(8 及更高版本)和 Scala(2.12 与 Java 接口 Function
进行互操作)中使用 lambda 编写,除非您有特定原因不这样做。
爪哇岛:
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
。
我不是在谈论Selenium的FluentWait。对于Java中的通用流畅api,它应该有一个默认值,不是吗?在这种情况下,Scala 中的命名参数对我来说看起来更好。例如
new FluentWait(timeout = 30.seconds, polling = 5.seconds)
ignoring
参数将被忽略,并将获得默认值 classOf[NoSuchElementException]
。
这是转换:
转换"等待"
Java和Scala在这里非常相似。请注意:
- Scala使用
[]
作为泛型,而不是Java的<>
。 - Scala的
SomeClass.class
版本是classOf[SomeClass]
。
爪哇岛:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
斯卡拉:
val wait = new FluentWait[WebDriver](driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(classOf[NoSuchElementException])
转换"foo"
这是说明函数式Java和Scala之间相似性的好地方 我正在将您的示例转换为Java中的函数式风格,并使用Java 10中引入的var
。Scala版本与这种风格非常非常相似。
您的爪哇:
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")));
斯卡拉:
val foo = wait.until(driver => driver.findElement(By.id("foo")))
在 Scala 中,可以使用_
代替函数调用中的显式参数名称。这是一个样式选择,但你也可以将上面的 Scala 代码编写为:
val foo = wait.until(_.findElement(By.id("foo")))