Создание модуля Geb для UL LI

Я пытаюсь создать модуль geb, представляющий неупорядоченный список элементов. Я видел примеры того, как это сделать с таблицами, но мне трудно перевести это на UL->LI элементы. Вот что у меня есть до сих пор:

class CheckoutPage extends Page {

  static content = {
    cartItemList { $(".cart_items ul") }
    cartItem { i -> module CartItem,  cartItems[i] }
    cartItems(required: false) { cartItemList.find("li.item") }
  }
}

class CartItem extends Module {
  static content = {
    thumbnail { $("img.book_cover", it) }
    itemInfo { $("div.item_info", it) }
    bookTitle { itemInfo.find("h1").find("a").text() }
  }
}

Когда я делаю следующее в своей спецификации:

def "add an item to the cart"() {
   when:
   to CheckoutPage, productId: "10001"

   then:
   cartItems.size() == 1
   def cartItem = cartItems(0)
   cartItem.bookTitle == "Test Book Title 001"
}

Я получаю следующую ошибку:

geb.error.UnresolvablePropertyException: невозможно разрешить bookTitle как содержимое для cartItems

Однако cartItem — это элемент DOM, потому что я могу это сделать, и это работает:

cartItem.find("div.item_info").find("h1").find("a").text() == "Test Book Title 001"

person Gregg    schedule 15.04.2013    source источник


Ответы (3)


Вы можете проверить этот пост в блоге. Он описывает почти точно то, что вы ищете.

http://adhockery.blogspot.com/2010/11/modelling-repeating-structures-with-geb.html

После просмотра этого сообщения в блоге я придумал для вашего класса страницы следующее:

class CheckoutPage extends Page {

  static content = {
    cartItemList { $(".cart_items ul") }
    cartItems(required: false) { 
      cartItemList.find("li.item").collect { item-> 
        module(CartItem, item)
      }
    }
  }
}

Тогда ваш модуль должен выглядеть так:

class CartItem extends Module {
  static content = {
    thumbnail { $("img.book_cover") }
    itemInfo { $("div.item_info") }
    bookTitle { itemInfo.find("h1").find("a").text() }
  }
}
person Jeremy Anderson    schedule 15.04.2013
comment
Я уже читал тот пост. Проблема с его примером OL в том, что он не так сложен, как мой, со всеми элементами, вложенными в каждый LI, поэтому я подумал, что модуль будет лучше инкапсулировать все это. - person Gregg; 15.04.2013

Похоже, у вас есть ошибка в коде — возможно, вы хотели сказать def cartItem = cartItem(0), а не def cartItem = cartItems(0). Кроме того, старайтесь избегать использования одних и тех же имен для локальных переменных и определений содержимого (как вы делаете для cartItem), поскольку это иногда приводит к конфликтам имен, которые довольно сложно отследить.

Вы можете упростить определение содержания, используя метод moduleList().

static content = {
    cartItemList { $(".cart_items ul") }
    cartItems { i -> moduleList CartItem, cartItemList.find("li.item"), i }
}

и в вашем тесте:

then:
cartItems.size() == 1 //here you use it to retrieve the full list
def item = cartItems(0) //here you use it to retrieve a single element
item.bookTitle == "Test Book Title 001"
person erdi    schedule 16.04.2013

Ответ на этот вопрос был комбинацией обоих ответов. Мне нужны были эти ответы, чтобы лучше понять, что происходит. Это фактическое решение:

class CheckoutPage extends Page {

  static content = {
    cartItemList { $(".cart_items ul") }
    cartItems(required: false) { module CartItem, cartItemList.find("li.item")}
  }
}

class CartItem extends Module {
  static content = {
    thumbnail { $("img.book_cover") }
    itemInfo { $("div.item_info") }
    bookTitle { itemInfo.find("h1").find("a").text() }
  }
}

И тест:

def "add an item to the cart"() {
    when:
    to CheckoutPage, productId: '10001'

    then:
    cartItems.size() == 1
    def cartItem = cartItems(0)
    cartItem.bookTitle == "Test Book Title 001"
}

Причина (я думаю) в том, что это работает, потому что мы имеем дело с отдельными элементами LI. Не контейнер, как TR с несколькими элементами TD. Таким образом, контекст здесь — это LI, и, используя модуль вместо moduleList, я имею дело только с отдельным элементом LI, а не с их списком. cartItems уже содержит элементы LI в виде списка.

По крайней мере, я так это понимаю и это работает.

person Gregg    schedule 16.04.2013
comment
Что-то мне здесь кажется не совсем правильным. Вы передаете параметр в cartItems, но определение cartItems не принимает параметр. Вы пробовали свой код с более чем одним товаром в корзине? - person erdi; 17.04.2013