我一直试图将WebBrowser
作为Selenium ScalaTest规范中的隐式参数传递,但它失败了。我有一个基础超类用于所有测试:
abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
implicit val webDriver: WebDriver = new FirefoxDriver
}
然后我有一个Page对象,其方法带有imp WebBrowser
参数:
object LoginPage extends Page {
def login(username: String, password: String) (implicit browser : WebBrowser ) = {
//...
}
然后我想从实际规范中调用login
方法。当spec类通过其WebBrowser
超类实现BaseSpec
特征时,我希望调用该方法的spec实例被解析为隐式WebBrowser:
class LoginSpec extends BaseSpec {
it("Should fail on invalid password") {
LoginPage login("wrong username", "wrong password")
assertIsOnLoginPage()
}
}
但是这会因编译错误而失败:
找不到参数浏览器的隐含值:org.scalatest.selenium.WebBrowser
在LoginPage login("wrong username", "wrong password")
我是否始终需要明确提供this
作为WebBrowser
参数值,还是有更好的方法?
答案 0 :(得分:2)
当spec类通过其BaseSpec超类实现WebBrowser特征时,我希望调用该方法的spec实例被解析为隐式WebBrowser
this
不能自动隐式显示,但您可以轻松添加它:
abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
implicit def webBrowser: WebBrowser = this
implicit val webDriver: WebDriver = new FirefoxDriver
}
答案 1 :(得分:1)
在此代码中创建class LoginSpec
内的隐式val:
trait WebBrowser
class WebDriver
class FunSpec
trait ShouldMatchers
class FirefoxDriver extends WebDriver
abstract class BaseSpec extends FunSpec with WebBrowser with ShouldMatchers {
implicit val webDriver: WebDriver = new FirefoxDriver
}
trait Page
object LoginPage extends Page {
def login(username: String, password: String)(implicit browser: WebBrowser) = {
println(username, password)
}
}
class LoginSpec extends BaseSpec {
implicit val browser: WebBrowser = this
def fun = {
LoginPage login("wrong username", "wrong password")
}
}
object ImplicitThis {
def main(args: Array[String]) {
new LoginSpec().fun
}
}
这个编译,并且工作得很好。