Передача состояния между страницами при использовании geb & spock - PullRequest
3 голосов
/ 03 сентября 2010

В приведенном ниже примере (взято из Книги Геба ) мы нажимаем кнопку, которая переносит нас на другую страницу.

class GoogleHomePage extends Page {
    static url = "http://google.com"
    static at = { 
        title == "Google" 
    }
    static content = {
        searchField { $("input[name=q]") }
        searchButton(to: GoogleResultsPage) { $("input[value='Google Search']") }
    }
}

Browser.drive(GoogleHomePage) {
    searchField.value("Chuck Norris")
    searchButton.click()
    assert at(GoogleResultsPage)
    assert resultLink(0).text() ==~ /Chuck/
}

Как мы можем передать состояние при переходе на другую страницу?Например, пользователь выбрал этот язык, на следующей странице я ожидаю, что страница будет на этом языке.Более общий пример:

import geb.*
import grails.plugin.geb.GebSpec

class GoogleHomePage extends Page {
   static url = "http://google.com"
   static at = { title == "Google" }
   static content = {
       searchField { $("input[name=q]") }
       searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") }
   }
}

class GoogleResultsPage extends Page {

  def searchTerm

  static at = {
    title == "${searchTerm} - Google Search"
  }
}

class MainFunctionalSpec extends GebSpec {

 def "Google search"() {
   when:
   to GoogleHomePage

   then:
   searchField.value("Chuck Norris")
   searchButton.click()
   assert at(GoogleResultsPage)
 }
}

В этом коде есть 2 проблемы, я получаю «Нет такого свойства: searchField для класса: GoogleHomePage» в searchButton.click () при попытке заполнить searchTerm.Даже если я жестко закодирую то, что передается, GoogleResultsPage.searchTerm имеет значение null, а at ast не выполняется.Есть идеи?

1 Ответ

3 голосов
/ 09 сентября 2010

Это не возможно с 0,4.Параметры карты для определений шаблонов становятся параметрами этого шаблона.Более того, шаблоны содержимого определяются в статическом контексте, но их определения закрытия оцениваются в контексте экземпляра.Конечным результатом является невозможность доступа к состоянию экземпляра с этой точки.

Решение состоит в том, чтобы использовать новые ловушки жизненного цикла в 0,5:

http://bamboo.ci.codehaus.org/browse/GEB-MASTERDEFAULTS/latest/artifact/Manual/pages.html#lifecycle_hooks

class GoogleHomePage extends Page {
    static url = "http://google.com"
    static at = { title == "Google" }
    static content = {
        searchField { $("input[name=q]") }
        searchButton(to: GoogleResultsPage, searchTerm:searchField.value()) { $("input[value='Google Search']") }
    }

    def onUnload(GoogleResultsPage nextPage) {
        nextPage.searchTerm = searchField.value()
    }
}

class GoogleResultsPage extends Page {
    def searchTerm
    static at = {
        title == "${searchTerm} - Google Search"
    }
}

Это доступно в последних загружаемых версиях 0.5-SNAPSHOT из репозитория моментальных снимков Codehaus.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...