页面对象中的元素接口应该被抽象多少?

时间:2012-04-25 20:14:11

标签: ruby cucumber watir-webdriver pageobjects

我有一个名为LineItemsPage的页面对象

class LineItemsPage
  attr_accessor :add_line_item_button

  def initialize(test_env)
    @browser              = test_env[:browser]
    @action_bar           = @browser.div(:id => 'lineitems_win').div(:class => 'window-body').div(:class => 'actionbar')
    @add_line_item_button = @action_bar.img(:class => 'button add')
  end

  def method_missing(sym, *args, &block)
    @browser.send sym, *args, &block
  end

end

我这样使用它:

When /^I click on Add Item and enter the following values:$/ do |table|
  @line_items_page = LineItemsPage.new(@test_env)
  @line_items_page.add_line_item_button.when_present.click
end

我想知道我是否应该通过在LineItemsPage类中添加以下内容来抽象点击:

def add_item
  self.add_line_item_button.when_present.click
end

然后像这样使用它:

@line_items_page.add_item

我正在寻找最佳实践,特别是关于Page Object或Ruby。我觉得使用add_item()封装接口有点远,但是我想知道如果我不这样做,我是否会意识到可能遇到的问题。

1 个答案:

答案 0 :(得分:1)

就个人而言,我尝试使用域语言使我的页面对象方法不参考实现。

我曾经做过像@line_items_page.add_line_item_button.when_present.click这样的事情,但它在以下情况下引起了问题:

1)添加订单项已从按钮更改为链接。

2)添加订单项的过程已经更改 - 比如现在通过右键单击完成,或者它已经变成了两个步骤(比如打开一些下拉菜单,然后点击添加行)。

在任何一种情况下,您都必须找到添加订单项的所有地点并进行更新。如果您拥有add_item页面对象方法中的所有逻辑,则只需更新一个位置。

从实现的角度来看,我发现Cheezy的页面对象访问器工作得很好。但是,对于图像按钮(或任何应用程序的自定义控件),我会向PageObject::Accessors module添加其他方法。或者,如果它们是一个关闭控件,您可以将方法直接添加到特定页面对象。

更新 - 回复有关某些起点的评论:

我没有遇到太多文档,但这里有一些可能有用的链接:

1)Cheezy Page Object project wiki - 给出了一个简单的例子来开始

2)Cheezy's blog posts页面对象gem首次启动。请注意,这里的内容可能与gem当前的实现方式不完全相同,但我认为它为理解他想要实现的内容奠定了良好的基础。这反过来使您更容易理解当您必须打开并修改宝石以满足您的需求时发生的事情。