我在理解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会发生什么? uiHeader
和seeGuideButton
到底是什么?它们与以下闭包有何关系?这种语法如何工作?
答案 0 :(得分:5)
Geb在幕后寻找一种带有签名的方法:
uiHeader(Map, Closure)
在常规情况下,您可以捕获缺少方法的时间(请参见methodMissing),因此Geb在内部将捕获此信息,并知道如何解决对该变量的任何将来请求
在常规情况下,最后一个参数Closure也可以放在方括号之外,这就是为什么可以这样做
uiHeader(required: false) { $('h1') }