代码之家  ›  专栏  ›  技术社区  ›  Peter

使用geb&spock时页之间的传递状态

  •  3
  • Peter  · 技术社区  · 14 年前

    在下面的示例中(取自 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)
     }
    }
    

    此代码有2个问题,我在searchbutton.click()上获取“no such property:searchfield for class:googlehomepage”来填充searchterm。即使我硬编码传递的内容,googleResultsPage.searchTerm为空,at断言也失败。有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Luke Daley    14 年前

    用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快照版本。

    推荐文章