在一个 Geb 测试中使用多个页面对象

Using multiple page objects in one Geb test

我正在尝试使用 spock 编写一个基本的登录 geb 测试。我创建了 2 个页面对象,一个用于登录页面,另一个用于登录后转到的页面。

登录页面

package Pages

import geb.Page

class loginPage extends Page {
    static url = 'login/'
    static at = {title == "Login to TalentBank"}
    static content = {
        logo {$(".center-img img")}
        emailHeader {$(".form-group label", text:"Email")}
        emailTextBox {$('#email')}
        pwdHeader {$(".form-group label", text:"Password")}
        pwdTextBox {$("#password")}
        loginButton {$("#loginButton")}
    }
}

主页

package Pages

import geb.Page

class homePage extends Page {
    static at = {title == "Home"}
    static content = {
        tile1 {$("#page-container > div.container-fluid > div > div:nth-child(2) > div")}
    }
}

测试规范。这是转到登录页面的基本测试,输入用户凭据,单击登录按钮,等待主页上的元素,然后验证您是否在主页上。

import Pages.loginPage
import Pages.homePage
import geb.spock.GebReportingSpec


class loginPageSpec extends GebReportingSpec {


    def "Log in to TalentBank Core"(){
        given:
        to loginPage
        waitFor {loginButton.isDisplayed()}

        when:
        emailTextBox.value("Ruxin")
        pwdTextBox.value("Test1234")
        loginButton.click()

        then:
        waitFor {tile1.isDisplayed()}
        at homePage
    }
}

当我运行测试时,我得到以下错误

Caused by: groovy.lang.MissingPropertyException: Unable to resolve tile1 as content for Pages.loginPage, or as a property on its Navigator context. Is tile1 a class you forgot to import?

它正在 loginPage 而不是 homePage 中寻找 tile1。

在测试中更改 at 位置,我还会添加页面引用,您将受益于自动完成功能。

登录页面

package Pages

import geb.Page

class LoginPage extends Page {

    static url = 'login/'

    static at = {
           title == "Login to TalentBank"
    }

    static content = {
        logo         {$(".center-img img")}
        emailHeader  {$(".form-group label", text:"Email")}
        emailTextBox {$('#email')}
        pwdHeader    {$(".form-group label", text:"Password")}
        pwdTextBox   {$("#password")}
        loginButton  {$("#loginButton")}
    }
}

首页

package Pages

import geb.Page

class HomePage extends Page {

    static at = {
           waitFor {title == "Home"} // Add waitFor here to verify on page
    }

    static content = {
        tile1 {$("#page-container > div.container-fluid > div > div:nth-child(2) > div")}
    }
}

测试规范:

import Pages.LoginPage
import Pages.HomePage
import geb.spock.GebReportingSpec


class LoginPageSpec extends GebReportingSpec {

    def "Log in to TalentBank Core"(){
        given:
        Page loginPage = to LoginPage
        waitFor {loginPage.loginButton.isDisplayed()}

        when:
        loginPage.emailTextBox.value("Ruxin")
        loginPage.pwdTextBox.value("Test1234")

        and: "Click login"
        loginPage.loginButton.click()

        then: "Check at home page"
        Page homePage = at HomePage

        and:
        waitFor {homePage.tile1.isDisplayed()}
    }
} 

修改 LoginPage 页面对象为

loginButton(to: HomePage)  {$("#loginButton")}

这会将范围切换到 HomePage 页面对象,并且 tile1 出现在那里

基本用法,无错误+重定向:

loginButton.click()

万一 #loginButton 触发了错误,没有重定向,那么像这样重载 loginButton 调用:

高级用法,错误 + 无重定向:

loginButton(LoginPage).click()