Samuel Graf
Samuel Graf

Reputation: 93

Can someone explain the syntax in the geb Page content DSL?

I have problems to understand the syntax with which pages are described (defined) in Geb. The following is an example page class that works fine but I don't understand how it works.

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

I am interested in the syntax inside the closure referred to by content. Geb describes the syntax for the content DSL as

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

I don't understand this syntax. The name part looks like a variable, but it is not declared (I miss a def or something similar) and the last part looks like a closure. But where is the connection between the name and the closure. There is no equal sign connecting the two. In a standard groovy class the syntax

«name» { «definition» }

does not compile. What happens in one line of the content DSL? What precisely are uiHeader and seeGuideButton and how are they related to the following closures? How does this syntax work exactly?

Upvotes: 2

Views: 409

Answers (1)

tim_yates
tim_yates

Reputation: 171144

Behind the scenes, Geb looks for a method with the signature:

uiHeader(Map, Closure)

In groovy, you can catch when a method is missing (see methodMissing) so internally Geb will catch this and know how to resolve any future requests for that variable

Also in groovy, a Closure as the last parameter can be outside the brackets, which is why you can do

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

Upvotes: 5

Related Questions