我想在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。而且,什么都没有意义
答案 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在这里非常相似。请注意:
[]
用作泛型,而不是Java的<>
。 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])
这是说明函数式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")))