我有以下设置:
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
不会产生相同的结果。
答案 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
可以减慢测试速度,从而使页面正确呈现。