通过示例的Geb登录规范

时间:2015-10-09 17:34:46

标签: grails groovy selenium-webdriver geb

我想熟悉Geb。我试图从Grails内部运行它,但这根本不重要,因为我的问题是Geb特有的。

我有以下test目录结构:

myapp/
    <lots of stuff here>
    test/
        functional/
            GebConfig.groovy
            LogInLogOutSpec.groovy
            pages/
                LogInPage.groovy
                DashboardPage.groovy

LoginPage.groovy(显然)是登录页面,DashboardPage是成功登录后应重定向到的位置。实际上,我有安全过滤器,它会检查您尝试访问的URL是否需要身份验证。如果是这样,他们会将您重定向到登录页面,成功登录后,再次将您重定向到您尝试访问的URL。

为了更好地衡量,这是包含我的登录页面的HTML(再次,这是Grails,因此GSP文件在运行时动态转换为HTML):

<!DOCTYPE html>
<html>
    <head>
        <title>Login</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    </head>
    <body>  
        <form action=“/myapp/auth/signIn" method="post">
            <input type="hidden" name="targetUri" value="/dashboard" />
            <table>
                <tbody>
                    <tr>
                        <td>Username:</td>
                        <td><input type="text" name="username" value="" /></td>
                    </tr>
                    <tr>
                        <td>Password:</td>
                        <td><input type="password" name="password" value="" /></td>
                    </tr>
                    <tr>
                        <td />
                            <td><input type="submit" value="Sign in" /></td>
                    </tr>
                </tbody>
            </table>
        </form>
    </body>
</html>

所以我需要一个Geb测试:

  1. 尝试转到信息中心页面(未经授权)
  2. 验证我们已被重定向到登录页面
  3. 以良好的凭据登录
  4. 验证我们不在仪表板页面
  5. 此外:

    • 我想选择:(a)基于浏览器( Firefox或Chrome )或(b)无头浏览器(我相信HtmlUnitDriver,但如果我错了,请纠正我。
    • 我希望Geb使用的登录凭据可以从GebConfig文件或某些外部参数(可能是作为提供给Grails命令行的env vars或runtime args)进行注入。基本上我不想在测试代码中存储用户名/密码。

    到目前为止我的最佳尝试:

    GebConfig.groovy

    driver = {
        // Again, or Firefox
        ChromeProfile profile = new ChromeProfile()
        Driver driverInstance = new ChromeDriver(profile)
        driverInstace.manage().window().maximize()
    
        driverInstance
    }
    
    baseNavigatorWaiting = true
    atCheckWaiting = true
    
    // Need to inject from some external process somehow, but make these
    // available to test specs somehow.
    username = System.env("USERNAME")
    password = System.env("PASSWORD")
    

    LogInLogOutSpec.groovy

    import geb.spock.GerbReportingSpec
    import spock.lang.*
    import pages.*
    
    @Stepwise
    class LogInLogOutSpec extends GebReportingSpec {
        String username
        String password
    
        /*
         * Attempt to go to user dashboard, and confirm you are instead
         * redirected to the login page. Login with good credentials,
         * and verify you are now logged in and at the dashboard.
         */
        def "successful login redirects to dashboard page"() {
            when:
            to DashboardPage
    
            then:
            "Login".equals($(".page-header").text())
    
            when:
            $("#login-form input[name=username]").value(username)
            $("#login-form input[name=password]").value(password)
    
            then:
            "Dashboard".equals($(".page-header").text())
        }
    }
    

    我想我关闭,但这显然是错误的。我出错的任何想法?谢谢!

2 个答案:

答案 0 :(得分:6)

您应该模块化您的测试代码。你应该使用

  • modules用于可在不同页面上发布的UI小部件
  • 页面(12)来建模某个HTML页面
  • 实际测试逻辑的规范

在您的代码示例中,您有一个仪表板页面,但没有登录页面对象。如果您的所有页面都可以登录或至少提供检测登录状态的可能性,您还应该考虑登录模块。有关模块定义,请参阅此SO answer。这里缺少的是一个确定登录状态的函数。对于另一个实现,请查看AuthModulelogin test specGeb examples

登录凭据:我认为您在环境中使用凭据做得很好。这在开发人员计算机上以及在构建服务器上都可以正常工作。

对于使用不同浏览器进行测试:geb-example-gradle是一个带有GebConfigbuild.gradle的gradle示例项目。这允许您将浏览器作为参数切换到gradle:

./gradlew chromeTest
./gradlew firefoxTest
./gradlew phantomJsTest

这也回答了你的上一个问题:我喜欢使用的一个好的无头浏览器是phantomJs

答案 1 :(得分:0)

请参阅此Geb spec以获取示例。主要是您可以查看LoginModule如何提供使用here的登录行为。

void login(String username = "admin@sample.org", String password = "admin") {
    loginForm.j_username = username
    loginForm.j_password = password
    loginButton.click()
}

应用程序使用HtmlUnit驱动程序。

请告知您是否需要进一步解释。