geb:登录请求后的RequiredPageContentNotPresent

时间:2017-08-07 08:56:37

标签: geb

我有以下设置:

class LoginPage extends Page {
    def login() { //fill user/pass, click "login"}
}

class IndexPage extends Page {
    static content = {
        sideTabs { module SideTabs }
    }
}

class TabAPage extends Page {
    //...
}

class SideTabs extends Module {
    static content = {
        tabA(to: TabAPage) { $(".sidetab-label", text: "tab A") }
    }
}

class TabALoginSpec extends GebReportingSpec {

    def setup() {
        to LoginPage
    }

    def "test foo"() { /* ... */ }

    def "test bar"() {

        when: 
        login()
//        report "after login"
        at IndexPage
        sideTabs.tabA.click()
        //...

        then: 
        // ...
    }
}

当我执行"测试栏"时,我得到:

geb.error.RequiredPageContentNotPresent: The required page content 'IndexPage -> sideTabs: SideTabs -> tabA: geb.navigator.EmptyNavigator' is not present

当我执行"测试栏"并取消注释报告行,测试通行证。

所以我猜测问题出在"在IndexPage"在页面加载完成之前返回。我不认为login()应该等待任何内容,因为如果登录失败,那么没有内容加载问题,如果登录成功 - 页面转换为索引。我尝试将wait:true添加到tabA的内容定义中,但无济于事。

有趣的是,在"测试栏"失败后,geb产生的屏幕截图,我实际上可以发现tabA元素......

帮助表示赞赏。

更新

添加

void onLoad(Page previousPage) {
    waitFor { sideTabs.tabA }
}
到目前为止,对IndexPage似乎解决了这个问题。我不清楚为什么在内容定义中添加wait:true不会产生相同的结果。

3 个答案:

答案 0 :(得分:1)

添加必需:false应该可以工作但放在这里:

class SideTabs extends Module {
    static content = {
        tabA(required:false, to: TabAPage) { $(".sidetab-label", text: "tab A") }
    }
}

答案 1 :(得分:0)

如果您不想在与页面交互之前等待加载所有内容,请在定义内容时使用required: false

e.g。

class IndexPage extends Page {
    static content = {
        sideTabs(required: false) { module SideTabs }
    }
}

所需声明的预期用途是隐藏内容,可在页面交互后显示。但它应该有助于这种情况。

答案 2 :(得分:0)

好的做法是在 IndexPage 类中添加at,查看文档here

你的课应该是这样的:

class IndexPage extends Page {

static at = {...}

static content = {
    sideTabs { module SideTabs }
    }
}

我认为使用report可以减慢测试速度,从而使页面正确呈现。