2

我正在尝试创建一个表示无序列元素列表的 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"
4

3 回答 3

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() }
  }
}
于 2013-04-15T14:12:57.227 回答
1

看起来您的代码中有错误 - 您可能想说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"
于 2013-04-16T16:44:09.080 回答
0

这个问题的答案是给出的两个答案的组合。我需要这些答案来更好地了解正在发生的事情。这是实际的解决方案:

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 元素作为 List 包含。

至少,我是这么理解的并且它正在工作。

于 2013-04-16T20:05:06.563 回答