使用geb&时在页面之间传递状态斯波克

时间:2010-09-02 20:59:03

标签: grails groovy

在下面的示例中(取自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断言失败。有任何想法吗?

1 个答案:

答案 0 :(得分: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版本中获得。