geb 0.12.2 中的 RequiredPageContentNotPresent 错误

RequiredPageContentNotPresent error in geb 0.12.2

在 Eclipse 中尝试 运行 作为 Maven 构建的一部分的 geb 测试时出现以下错误:

Scenario: Perform login  Time elapsed: 0.009 sec  <<< FAILURE!
geb.error.RequiredPageContentNotPresent: The required page content 'userName - SimplePageContent (owner: LoginPage, args: [], value: null)' is not present

错误的唯一模式似乎是每次我尝试使用 geb 选择器 select/find 一些页面内容时都会抛出它,但使用选择器应该开箱即用,对吧?

我正在使用以下工具和库:

这是我的 .feature 文件:

Feature: Login

  Scenario: Perform login
    Given the user is at the login page
    When the user enters <some_uid> and <some_pwd>
    Then the user should be logged in

这是我的步骤定义:

package stepdefs

import pages.LoginPage

import static cucumber.api.groovy.EN.*

Given(~"the user is at the login page") { ->
    to LoginPage
    assert at(LoginPage)
}

When(~"the user enters (.*) (.*)") { user, password ->
    at LoginPage
    page.doLogin(user,password)
}

Then(~"the user should be logged in"){ ->
    assert at(LoginResultPage)
}

这是我的页面定义:

package pages

import geb.Page

class LoginPage extends Page {

    static url = "/TSADG_BORGER/loginpin.do"       
    static at = { title == "TastSelv Borger" }

       static content = {       
        loginForm { $($/form/$,id:"mainForm") }
        userName { loginForm.find("input",id:"pnr") }
        pass { loginForm.find("input",id:"tastselvKode") }
        buttonLogin { loginForm.find("input",id:"bt1") }
    }

    def doLogin(user, password) {
        userName = user
        pass = password
        buttonLogin.click()
    }
}

这是表格的 HTML:

<form id="mainForm" action="/TSADG_BORGER/loginpin.do" role="form" method="post" autocomplete="off">
                <input type="hidden" name="dispatch" value="Valider">       
                <div class="row skts-centered-padding">
                    <div class="col-sm-12">                         
                        <h1>Log på med TastSelv-kode</h1>
                    </div>                                              
                    <div class="col-sm-6">
                        <div class="skts-process-form-section skts-required  ">
                            <p><label for="pnr">Cpr-nummer</label></p>
                            <div>
                                <input id="pnr" type="text" value="" class="form-control skts-required-val" name="pnr" size="16" maxlength="14" data-validation-event="blur" data-show-type="string" data-show-facets="pattern" data-show-facet-values="/(^\d{10}$)|(^\d{6}\-\d{4}$)/" aria-required="true" aria-invalid="false" aria-describedby="pnrError " autocomplete="off">                                   
                            </div>
                        </div>
                        <div class="skts-process-form-section skts-required">
                            <p><label for="tastselvKode">TastSelv-kode</label></p>
                            <div>
                                <input id="tastselvKode" type="password" value="" class="form-control skts-required-val" name="tastselvKode" size="16" maxlength="16" data-show-type="string" data-show-facets="pattern" data-show-facet-values="/^[^]{7,16}$/" data-validation-event="blur" aria-required="true" aria-invalid="false" aria-describedby="tastSelvKodeError " autocomplete="off">                                                                    
                            </div>
                        </div>
                        <br>
                        <p>
                            <input type="submit" id="bt1" class="btn btn-primary skts-validate" value="Fortsæt" autocomplete="off">
                        </p>
                    </div>
                </div>
            </form>

感谢任何帮助和意见。

我会稍微重新安排一下您的内容部分:

static content = {       
    loginForm { $("form#mainForm"") }
    userName { $("input#pnr") }
    pass { $("input#tastselvKode") }
    buttonLogin { $("input#bt1") }
}

在 Geb 中使用 jQuery 选择器!它们非常方便。请注意,如果您使用唯一 ID,$("#mainForm"") 将具有与 $("form#mainForm"") 相同的效果。第一个版本更简单,第二个版本更具表现力;)

更多信息:http://www.w3schools.com/jquery/jquery_ref_selectors.asp

并且:http://www.gebish.org/manual/current/#the-jquery-ish-navigator-api

问题已解决

我非常确信这一定是选择器的问题,所以我花了一段时间才从沙子中清醒过来并退后一步。当我这样做时,我意识到 "LoginPage" class 中的 URL 实际上重定向到了另一个页面,这是我没有预料到的。我被重定向到的页面显然不包含我在内容部分中寻找的任何对象。因此,当错误消息指出 "The required page content...is not present" 时,那是绝对正确的。

我犯了一个非常愚蠢的错误...