0

我正在尝试使用 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)
            ...

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

[信息] x 在网站上以管理用户身份登录 [错误] 'org.fluentlenium.core.action.FillConstructor@1c25c183' 不等于 '200' (TestWebsiteAuthentication.scala:93) [错误] 预期:200 [错误]实际:org.fluentlenium.core.action.FillConstructor@1c25c183

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

我试过去掉“must equalTo(OK)”,但这只会导致表单提交失败——不幸的是,我找不到任何关于如何做到这一点的文档,所以我基本上是在拼凑它一点一点地在一起。指向相关文档的指针将不胜感激 - Tyrpesafe 似乎没有任何完整的东西......只是让你开始的“预告片”,但没有深度。:-(

4

1 回答 1

0

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

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

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",但第二个输入仍然是空的。事实证明第二个是空的,因为它是密码类型的输入,但是我最终使表单登录工作。

以下是您可以查看的内容列表:

  • 在该规范中启用了数据库
  • 让它填充用户(如果您的表单验证连接到数据库,即)
  • 根据我的经验,browser.goTo在测试中多次使用不会很好地提交表单(任何人都可以确认?)

希望这可以帮助

于 2015-12-11T05:25:22.557 回答