如何迭代页面对象表

时间:2015-04-15 20:47:57

标签: watir-webdriver page-object-gem

检查表格中每一行都有编辑链接的最简洁方法是什么?

示例代码:

class AccountPage
  include PageObject
  table(:cards, id: 'cards')
  link(:edit, href: /edit/)
end

我希望能够做到这样的事情:

page.cards_element.each do |card|
  card.edit? should == true
end

这不会起作用,因为每个块将返回一个PageObject表行,唯一的选择是再次迭代以获取单元格,然后我认为只能实现单元格文本。

1 个答案:

答案 0 :(得分:3)

解决方案1 ​​ - 嵌套定位器

最快的解决方案是在迭代表行时使用嵌套元素方法。

class AccountPage
  include PageObject
  table(:cards, id: 'cards')
end

page = AccountPage.new(browser)
page.cards_element.each do |card|
  card.link_element(href: /edit/).visible?.should == true
end

card.link_element(href: /edit/).visible?行说每张卡(即表格行),检查是否有可见的链接元素。

解决方案2 - 小工具

使用嵌套定位器方法的缺点是页面的详细信息现在位于测试代码中而不是页面对象中。这可以通过使用自定义小部件来解决。

您需要定义一个表示表格行的小部件:

class Card < PageObject::Elements::TableRow
  def edit_element
    link_element(href: /edit/)
  end
end
PageObject.register_widget :card, Card, :tr

然后将页面对象定义为包含小部件:

class AccountPage
  include PageObject
  cards(:card, :css => 'table#cards tr')
end

然后,您可以将测试编写为:

page = AccountPage.new(browser)
page.card_elements.each do |card|
  card.edit_element.visible?.should == true
end

请注意,如果没有编辑链接,这将在第一行失败。为了提高可读性并确保测试所有行,我建议使用包含expect方法的all语法:

page = AccountPage.new(browser)
expect(page.card_elements.map(&:edit_element)).to all be_visible