2012-04-25 44 views
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 

我在尋找最佳實踐,無論是關於Page Object還是一般的Ruby。我覺得通過使用add_item()來封裝接口有點過分,但我想知道如果我不這樣做,我可能會遇到問題。

回答

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以適應你的需要時發生的事情。

+0

有沒有關於Cheezy的頁面對象入門的任何文檔?我想使用它,但我還沒有找到任何教程,並且我把它放在了後面,儘管我覺得這樣做不好。 – 2012-04-26 23:02:18

+1

回答更新了一些鏈接以作爲起點。 – 2012-04-27 02:01:38