使用 geb 和 spock 时在页面之间传递状态

2024-01-01

在下面的示例中(取自盖布之书 http://geb.codehaus.org/manual/latest/index.html),我们点击一​​个按钮,将我们带到另一个页面。

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

这段代码有两个问题,当尝试填充 searchTerm 时,我在 searchButton.click() 上收到“没有这样的属性:类的 searchField:GoogleHomePage”。即使我对传递的内容进行硬编码,GoogleResultsPage.searchTerm 仍为 null 并且 at 断言失败。有任何想法吗?


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

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

http://bamboo.ci.codehaus.org/browse/GEB-MASTERDEFAULTS/latest/artifact/Manual/pages.html#lifecycle_hooks 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 版本中可用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 geb 和 spock 时在页面之间传递状态 的相关文章

随机推荐

  • 为什么在 ES6 的严格模式下 `"foo".bar = 42;` 会抛出 `TypeError` ?

    根据ES5 1规范 该程序 use strict foo bar 42 导致String要创建的对象 分配给它的属性 然后扔掉该对象 导致没有可观察到的效果 包括任何异常 可以通过在 Opera 12 等兼容 ES5 的 JS 实现中尝试来
  • request.GET.get 在做什么?

    我正在看 A Mele Django 示例 第 1 章 def post list request category None object list Post published all paginator Paginator objec
  • IDP 发起的 SSO (SAML) 中是否需要 Keystore/JKSKeyManager?

    我已经使用 Spring SAML 扩展成功实现了 SSO 身份验证 我们的主要要求是支持 IDP 发起的对我们的应用程序的 SSO 好吧 通过使用 spring security saml2 sample 中的配置 即使是 SP 发起的
  • Rails 4 date_field,最小和最大年份?

    我正在尝试使用 Rails 4 方法 date field 为表单设置最大年份值 因为用户似乎可以输入大于 4 位数字的年份 我一直在尝试这样使用 但似乎没有任何效果 我就是这样做的 我使用 Ruby 的 Date 类中的方法使用内置选择器
  • OpenGL 和线程

    众所周知 OpenGL 驱动程序通常不支持多线程 然而 是否必须处理主线程 例如 SDL 调出 GL 上下文 如果一个线程产生一个线程并且从那时起 从那里发送 OpenGL 命令安全吗 或者有没有 仅限于启动 GL 的主线程 语境 您需要将
  • 使用 jQuery 即时创建标签

    我需要动态创建标签和文本字段 并且还包括文本字段的日期选择器 我需要这样的东西
  • JQuery .load() 回调函数

    我见过很多类似问题的问题和解决方案 但没有一个对我有用 我有这个 function bdiv load bosses php icc10n function return bdiv html 但这不起作用 为了澄清一下 我想将内容加载到 b
  • Xcode版本预处理器

    我的应用程序中有一个小错误 仅在使用 Xcode 6 构建时存在 我修复了此错误 但在使用 Xcode 5 构建时这部分出现了错误 因此 两个 Xcode 版本之间展开了一场丑陋的战斗 现在 我想检查使用哪个 Xcode 版本通过预处理器构
  • 如何在 Jasmine 中正确模拟 Amplify 以进行单元测试?

    我对单元测试还很陌生 所以请耐心等待 我正在尝试对一项服务进行单元测试 该服务用于在 Angular 应用程序中使用 Amplify 登录用户 现在在规范文件中我正在做 beforeEach async gt TestBed configu
  • 替换换行符,但保留空行

    我想用空格替换换行符 r n 但我想保留空白行 换句话说 如果 r n 前面没有另一个 r n 我想用 替换 r n 例如 line 1 line 2 line 3 line 4 最终应该是 line 1 line 2 line 3 lin
  • 无法近似具有 1 个隐藏层的神经网络中的简单乘法函数

    我只是想测试神经网络近似乘法函数 回归任务 的效果如何 我正在使用 Azure 机器学习工作室 我有 6500 个样本 1 个隐藏层 我已经测试了每个隐藏层 5 30 100 个神经元 没有标准化 以及默认参数学习率 0 005 学习迭代次
  • 错误:用于两个不同的模块路径

    当我尝试运行时出现错误go build 错误是这样的 go golang org x email protected cdn cgi l email protection used for two different module path
  • 类型“订阅”缺少以下属性

    当我编写此代码时 IDE 显示错误 我有一个组件调用 ngOnInit 中的服务来获取数据 服务调用其他服务来获取一些数据并使用它来获取数据然后返回它 成分 ngOnInit const token abc this service get
  • HTMLCollection 和 NodeList 是可迭代的吗?

    在 ES6 中 一个iterable https developer mozilla org en docs Web JavaScript Reference Iteration protocols是一个对象 允许for of 并且有一个
  • 无法使用 IP 或 PC 名称在本地访问 apache Web 应用程序

    我在 Windows 8 上安装了 Wamp Server 然后安装了一个 php Web 应用程序 我可以通过 http localhost webapp 或 http localhost phpmyadmin 访问它 我希望能够从同一网
  • 这是Python函数重载的一个例子吗?

    我知道Python不允许我们重载函数 但是 它有内置的重载方法吗 考虑一下 setattr object name variable value setattr class name method function 第一个语句在运行时动态地
  • 在 Elixir 中如何使用映射变量初始化结构体

    我知道可以通过以下方式创建结构 User email email protected cdn cgi l email protection 但如果我有一个变量params email email protected cdn cgi l em
  • SQL Server 和 .net 支持使用参数值调用存储过程而不提供参数名称吗?

    假设我在 SQL Server 中有一个名为 sp GetData1 的存储过程 其参数为 Input1 int Input2 string 该存储过程将返回一个数据表 为了从此存储过程获取数据表 我使用 ADO NET 为了执行这个存储过
  • 为什么“mvn编译”需要“test-jar”依赖项

    我使用时遇到问题test jar多模块项目中的依赖关系 例如 当我声明cleartk syntax模块取决于cleartk token模块的test jar像这样 完整的代码是here https cleartk googlecode co
  • 使用 geb 和 spock 时在页面之间传递状态

    在下面的示例中 取自盖布之书 http geb codehaus org manual latest index html 我们点击一 个按钮 将我们带到另一个页面 class GoogleHomePage extends Page sta