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

Sam*_*raf 2 syntax dsl groovy spock 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)}
    }
}
Run Code Online (Sandbox Code Playgroud)

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

«name»(«options map») { «definition» }
Run Code Online (Sandbox Code Playgroud)

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

«name» { «definition» }
Run Code Online (Sandbox Code Playgroud)

不编译.在内容DSL的一行中会发生什么?究竟是什么uiHeader以及seeGuideButton它们如何与以下关闭相关?这种语法如何正常工作?

tim*_*tes 5

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

uiHeader(Map, Closure)
Run Code Online (Sandbox Code Playgroud)

在groovy中,你可以在方法丢失时捕获(请参阅methodMissing),以便内部Geb将捕获这个并知道如何解决该变量的任何未来请求

同样在groovy中,Closure作为最后一个参数可以在括号之外,这就是你可以做到的原因

uiHeader(required: false) { $('h1') }
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,`methodMissing()`处理内容定义可以在`PageContentTemplateBuilder`中找到,网址是https://github.com/geb/geb/blob/09d4a5c5dabec9d461e7901c21fd717faf4ae336/module/geb-core/src/main/groovy/创业板/内容/ PageContentTemplateBuilder.groovy#L78 (2认同)