2010-09-02 57 views
3

在下面的示例中(取自Book of Geb),我们正在单击一个按钮,将我们带到另一页面。使用geb&spock时在页面之间传递状态

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

此代码有2个问题,我得到一个“没有这样的属性:searchField类:GoogleHomePage”关于searchButton.click试图填充SEARCHTERM时()。即使我对传递的内容进行了硬编码,GoogleResultsPage.searchTerm也是null,并且at声明失败。有任何想法吗?

+0

我可以在我的实际测试中检查此状态,但我宁愿将此断言保存在Page Model – Peter 2010-09-02 22:33:08

回答

3

这对于0.4而言并不可行。模板定义的映射选项成为该模板的选项。更重要的是,内容模板是在静态上下文中定义的,但是它们的闭包定义是在实例上下文中进行评估的。最终的结果是从这一点无法访问实例状态。

的解决方案是使用新的生命周期挂钩在0.5:

http://bamboo.ci.codehaus.org/browse/GEB-MASTERDEFAULTS/latest/artifact/Manual/pages.html#lifecycle_hooks

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版本。

+0

完美 - 谢谢! – Peter 2010-09-09 04:36:49