首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Geb登录规范

Geb登录规范
EN

Stack Overflow用户
提问于 2015-10-09 17:34:45
回答 2查看 3.7K关注 0票数 8

我正试着熟悉Geb。我正在尝试从Grails内部运行它,但是这一点都不重要,因为我这里的问题是针对Geb的。

我有以下test目录结构:

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
<!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. 验证我们不在仪表板页面

此外:

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

到目前为止,我最大的努力是:

GebConfig.groovy

代码语言:javascript
复制
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

代码语言:javascript
复制
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())
    }
}

我想我已经接近了,但这显然是错误的。你知道我要去哪里吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-10-13 14:22:52

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

  • 可以发生在不同页面上的UI小部件的模块
  • 页面(12)来建模特定的HTML页面
  • 实际测试逻辑的规范

在您的代码示例中,您有一个仪表板页,但没有登录页对象。如果您的所有页面都可以登录,或者至少提供检测登录状态的可能性,您还应该考虑登录模块。有关模块定义,请参见此所以回答。这里缺少的是一个用于确定登录state.For的函数,另一个实现是AuthModuleGeb实例登录测试规范

登录凭据:我认为您在环境中拥有凭据的工作做得很好。这在开发人员机器和构建服务器上都能很好地工作。

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

代码语言:javascript
复制
./gradlew chromeTest
./gradlew firefoxTest
./gradlew phantomJsTest

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

票数 6
EN

Stack Overflow用户

发布于 2015-10-17 00:58:16

有关示例,请参阅此Geb规范。主要是您可以检查LoginModule是如何提供使用这里的登录行为的。

代码语言:javascript
复制
void login(String username = "admin@sample.org", String password = "admin") {
    loginForm.j_username = username
    loginForm.j_password = password
    loginButton.click()
}

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

如果你需要进一步解释的话,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33044117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档