Может кто-нибудь объяснить синтаксис в DSL-странице содержимого страницы geb? - PullRequest
0 голосов
/ 05 января 2019

У меня проблемы с пониманием синтаксиса, с которым страницы описаны (определены) в 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» }

Я не понимаю этот синтаксис. Часть name выглядит как переменная, но она не объявлена ​​(я пропускаю def или что-то подобное), а последняя часть выглядит как замыкание. Но где связь между именем и закрытием. Там нет знака равенства, соединяющего два. В стандартном классном классе синтаксис

«name» { «definition» }

не компилируется. Что происходит в одной строке контента DSL? Что такое uiHeader и seeGuideButton и как они связаны со следующими замыканиями? Как именно работает этот синтаксис?

1 Ответ

0 голосов
/ 05 января 2019

За кадром Геб ищет метод с подписью:

uiHeader(Map, Closure)

В groovy вы можете ловить, когда метод отсутствует (см. MethodMissing), поэтому Geb внутренне его поймает и знает, как разрешить любые будущие запросы для этой переменной

Также в groovy, Закрытие как последний параметр может быть вне скобок, поэтому вы можете сделать

uiHeader(required: false) { $('h1') }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...