1

我有一个名为 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

我正在寻找最佳实践,特别是关于页面对象或一般的 Ruby。我觉得通过 using 封装接口add_item()有点远,但我想知道我是否不知道如果我不这样做可能会遇到问题。

4

1 回答 1

1

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

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

1) 添加行项目从按钮更改为链接。

2) 添加行项目的过程发生了变化 - 比如说现在通过右键单击完成,或者它已成为一个两步过程(例如打开一些下拉菜单,然后单击添加行)。

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

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

更新- 回复关于一些起点的评论:

我没有遇到太多文档,但这里有几个链接可能会有所帮助:

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

2) Cheezy 的博客文章,页面对象 gem 首次开始的地方。请注意,这里的内容可能与 gem 当前的实现方式并不完全一致,但我认为它为理解他想要实现的目标提供了良好的基础。当您必须打开并修改 gem 以满足您的需要时,这反过来又使您更容易理解正在发生的事情。

于 2012-04-26T16:43:38.323 回答