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

时间:2017-11-21 05:20:42

标签: groovy spock geb

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

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

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
    }
}

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

  

引起:groovy.lang.MissingPropertyException:无法解决   tile1作为Pages.loginPage的内容,或作为其上的属性   导航器上下文。 tile1是否是您忘记导入的类?

它在loginPage而不是homePage中查找tile1。

2 个答案:

答案 0 :(得分:2)

更改测试中的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")}
    }
}

TestSpec:

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()}
    }
} 

答案 1 :(得分:0)

使用

修改LoginPage页面对象
loginButton(to: HomePage)  {$("#loginButton")}

这会将范围切换到HomePage页面对象,而tile1就在那里

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

loginButton.click()

以防#loginButton触发错误,没有重定向,然后像这样重载loginButton调用:

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

loginButton(LoginPage).click()