在ScalaTest和FluentLenium中填充和测试Web表单的正确方法

时间:2015-04-19 19:39:14

标签: forms scala playframework-2.0 scalatest fluentlenium

我正在尝试使用ScalaTest和FluentLenium在Play Framework中填充,提交和测试Web表单。看起来它应该非常简单,但我遇到了各种各样的问题。

首先,有问题的网络表单的一部分:

<form class="signin" id="loginform" method="POST" action="/login">
    <div class="form-group">
        <label for="name">Email Address:</label>
        <input type="email" class="form-control" placeholder="Enter Email Address" id="email" name="email"  required />
        ...

这可以从真正的网络浏览器中正常工作。现在当我尝试填写并提交表格时出现问题:

@RunWith(classOf[JUnitRunner])
@SharedDriver(deleteCookies = false)
@SharedDriver(`type` = SharedDriver.SharedType.PER_CLASS)
class TestWebsiteAuthentication extends Specification {
    "Application" should {
        "login as an administrative user on the web site" in new WithBrowser with GPAuthenticationTestUtility {
            browser.goTo(loginURL)
            browser.fill("#email").`with`(prerequisiteAccounts.head.userIdentity) must equalTo(OK)
            ...

在最后一行,我得到一个例外:

[info] x登录网站上的管理用户 [error]'org.fluentlenium.core.action.FillConstructor@1c25c183'不等于'200'(TestWebsiteAuthentication.scala:93) [错误]预计:200 [错误]实际:org.fluentlenium.core.action.FillConstructor@1c25c183

我在这里做错了什么想法?

我已经尝试取出“必须等于(好)”但这只会导致表单在提交时失败 - 遗憾的是,我无法找到有关如何执行此操作的任何文档,所以我'我基本上把它拼凑在一起。对相关文档的指示将不胜感激 - 在Tyrpesafe似乎没有任何完整的东西......只是“戏弄”让你开始,但没有深度。 : - (

1 个答案:

答案 0 :(得分:0)

当您编写browser.fill("#email").``with``("x@y.com")时,您所做的一切就是告诉Fluentlenium编辑模板以在输入标记内添加值属性。 另一方面,OK是HTTP状态代码,因此比较它们自然会产生错误。

当您说您尝试提交表单但失败时,我假设您执行了以下操作:

browser.fill("#email").`with`("x@y.com")
browser.fill("#password").`with`("myPass")
browser.click("#button")   // this should submit the form and load the page after login

然后尝试做出如下的断言:

browser.title() must equalTo("next page") // fails because "next page" != "login page"

一个建议是在browser.click之前尝试这样的事情:

browser.pageSource() must contain("xyz") // this will fail

当上述断言失败时,它会将browser.pageSource()的内容打印到您的终端,并且您将能够看到Fill函数对HTML所做的修改。

就我而言,我发现我的pageSource()现在包含以下内容:

<input type="text" id="email" name="email" value="x@y.com"/>
<input type="password" id="password" name="password"/>

注意第一个输入有value="x@y.com",但第二个输入仍为空。事实证明第二个是空的,因为它是类型密码的输入,但是我最终使表单登录工作。

以下列出了您可以查看的内容:

  • 在该Spec
  • 中启用了数据库
  • 让用户填充(如果您的表单验证连接到数据库,那就是)
  • 根据我的经验,在测试中不止一次使用browser.goTo将不能很好地提交表单(任何人都可以确认?)

希望这有帮助