在下面的示例中(取自Book of Geb),我们点击了一个按钮,将我们带到另一个页面。
class GoogleHomePage extends Page {
static url = "http://google.com"
static at = {
title == "Google"
}
static content = {
searchField { $("input[name=q]") }
searchButton(to: GoogleResultsPage) { $("input[value='Google Search']") }
}
}
Browser.drive(GoogleHomePage) {
searchField.value("Chuck Norris")
searchButton.click()
assert at(GoogleResultsPage)
assert resultLink(0).text() ==~ /Chuck/
}
当我们去另一个页面时,我们如何通过状态?例如,用户选择了这种语言,在下一页中,我希望页面使用该语言。一个更通用的例子:
import geb.*
import grails.plugin.geb.GebSpec
class GoogleHomePage extends Page {
static url = "http://google.com"
static at = { title == "Google" }
static content = {
searchField { $("input[name=q]") }
searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") }
}
}
class GoogleResultsPage extends Page {
def searchTerm
static at = {
title == "${searchTerm} - Google Search"
}
}
class MainFunctionalSpec extends GebSpec {
def "Google search"() {
when:
to GoogleHomePage
then:
searchField.value("Chuck Norris")
searchButton.click()
assert at(GoogleResultsPage)
}
}
此代码有两个问题,我在searchButton.click()上尝试填充searchTerm时得到“没有这样的属性:searchField for class:GoogleHomePage”。即使我硬编码传递的内容,GoogleResultsPage.searchTerm为null且at断言失败。有任何想法吗?
答案 0 :(得分:3)
0.4这是不可能的。模板定义的映射选项成为该模板的选项。更重要的是,内容模板在静态上下文中定义,但它们的闭包定义在实例上下文中进行评估。最终结果是从那一点开始无法访问实例状态。
解决方案是在0.5:
中使用新的生命周期钩子class GoogleHomePage extends Page {
static url = "http://google.com"
static at = { title == "Google" }
static content = {
searchField { $("input[name=q]") }
searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") }
}
def onUnload(GoogleResultsPage nextPage) {
nextPage.searchTerm = searchField.value()
}
}
class GoogleResultsPage extends Page {
def searchTerm
static at = {
title == "${searchTerm} - Google Search"
}
}
这可从codehaus快照存储库中的最新可下载0.5-SNAPSHOT版本中获得。