有人可以解释geb Page内容DSL中的语法吗?

时间:2019-01-05 15:02:28

标签: groovy syntax spock dsl geb

我在理解Geb中描述(定义)页面所用的语法时遇到问题。以下是一个可以正常工作的示例页面类,但我不知道它是如何工作的。

import geb.Page

class GebHomePage extends Page{
    static url = "http://gebish.org"

    static at = { title == "Geb - Very Groovy Browser Automation" }

    static content = {
        seeGuideButton { $('div', class:'ui huge primary button') }
        uiHeader { $('h1', class:'ui header', 0)}
    }
}

我对由内容引用的闭包内部的语法感兴趣。 Geb将内容DSL的语法描述为

«name»(«options map») { «definition» }

我不了解这种语法。名称部分看起来像一个变量,但是没有声明(我错过了def或类似的东西),最后一部分看起来像一个闭包。但是名称和闭包之间的联系在哪里。两者之间没有等号。在标准的groovy类中,语法

«name» { «definition» }

不编译。一行内容DSL会发生什么? uiHeaderseeGuideButton到底是什么?它们与以下闭包有何关系?这种语法如何工作?

1 个答案:

答案 0 :(得分:5)

Geb在幕后寻找一种带有签名的方法:

uiHeader(Map, Closure)

在常规情况下,您可以捕获缺少方法的时间(请参见methodMissing),因此Geb在内部将捕获此信息,并知道如何解决对该变量的任何将来请求

在常规情况下,最后一个参数Closure也可以放在方括号之外,这就是为什么可以这样做

uiHeader(required: false) { $('h1') }