2015-11-24 2 views
0

geb.Page Учитывая, как:Понимание того, как получить доступ к объектам контента на geb.Page

class ConsultaPage extends Page { 

static url = "web/search-basic" 

static content = { 
    titol { $('h4',0).text() } 
    searchBox { $(name: "criteria").module(TextInput) } 
    searchButton { $(By.id("submit_button")) } 
    seriesBuscadorButton { $('img', src:"/web/resources/img/find") } 
} 

static at = { 
    $("#serveis h2").text() == "Menú consulta" 
} 

void openSeriesBuscador(){ 
    seriesBuscadorButton.click() 
} 
} 

И в Spec, как:

class id_3031_PageSpec extends BaseGebSpec { 

def "login ok com usuari normal accedeix a consulta i obre minibuscador series"(){ 
    given: 
     via iArxiuPage 
    when: 
     // unrelated stuff...  
    then: 
     to ConsultaPage 
    and: 
     //this works -> $('img', src:"/refweb/resources/img/find")*.click()    
     //this also works-> seriesBuscadorButton.click()    
     openSeriesBuscador() 
    then: 
     titol.equals("Cerca i selecció de sèrie")  
} 
} 

(BaseGebSpec только в GebSpec с общим setupSpec() для читая общие свойства для всех характеристик)

Если я запустил это, я получаю:

Condition not satisfied: 

openSeriesBuscador() 
| 
null 

Condition not satisfied: 

openSeriesBuscador() 
| 
null 

Если вместо использования: openSeriesBuscador() метода (который использует переменную контент с логикой же $()) Я использую $('img', src:"/refweb/resources/img/find").click() или seriesBuscadorButton.click() она прекрасно работает.

Я думаю, что я неправильно понимаю функциональность переменных содержимого или доступ к ним, но я не смог найти его, глядя на книгу Геб. Может ли кто-нибудь помочь мне понять это поведение?

Почему доступ к переменной статического содержимого внутри страницы метода невозможен, но не соответствует классу Spec? Спасибо заранее!

ответ

1

следует вызвать openSeriesBuscador() в when: блоке и не then: блока.

+0

Я звонил в блок «и:», а не в «затем:». В любом случае спасибо за совет! – exoddus

+0

Блок 'и:', расположенный после блока 'then:', эквивалентен блоку 'then:', и инструкции, помещенные в такой блок, будут утверждаться для вас, следовательно, для ошибки. Изменение типа возврата на 'def' заставляет его работать, но это скорее обходное решение, чем требование, потому что вы действительно не хотите утверждать результат этого вызова в этом случае. – erdi

+0

Crystal clear now! – exoddus

1

проблема в методе

void openSeriesBuscador(){ 
    seriesBuscadorButton.click() 
} 

должно быть

def openSeriesBuscador(){ 
    seriesBuscadorButton.click() 
} 

уведомление Защиту вместо недействительным

Первое, что вам нужно знать, это то, что делает def означает для объяснения здесь: https://stackoverflow.com/a/9247169/426096

и «магия» в then блоке Spock: http://mrhaki.blogspot.de/2010/07/spock-spotlight-assert-magic.html

+0

Совершенно верно. Спасибо за свет! – exoddus

+0

Как указывает @erdi, ваше решение заставляет его работать, но моя проблема связана не только с объявлением моего метода, но и с его именем (затем/и блоками). Теперь я понял, что implicits утверждает, где выполняется метод openSeriesBuscador(), и это не было моим намерением. В любом случае, спасибо за вашу помощь! – exoddus

+0

@exoddus в порядке, но это то, о чем вы просили. Конечно, неправильно, как вы поместили код, но вы спросили qoute: «Почему доступ к переменной статического содержимого внутри страницы метода невозможен, но не относится к классу Spec?» и если вы хотите использовать его, вам нужно использовать его, как я уже упоминал. Рад, что это работает для вас – gajo