检查表中的每一行是否有编辑链接的最干净方法是什么?
示例代码:
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 - 嵌套定位器
最快的解决方案是在循环访问表行时使用嵌套元素方法。
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
请注意,如果没有编辑链接,这将在第一行失败。为了提高可读性并确保测试所有行,我建议转到包含all
方法的expect
语法:
page = AccountPage.new(browser)
expect(page.card_elements.map(&:edit_element)).to all be_visible