2015-07-20 47 views
0

我由專家硒定義的頁面對象模式(POP)的一大倡導最佳實踐: https://code.google.com/p/selenium/wiki/PageObjects下面的測試自動化的「方法返回其他PageObjects」在Ruby中

他們的主要觀點使用Appium與Java的時候是我始終遵循: 「方法返回其他PageObjects」

e.g. LoginPage loginPage = homePage.gotoLoginPage(); 

我現在想使用如下葫蘆使用Ruby POP等一直是這樣寫代碼:

e.g. @login_page = @home_page.goto_login_page 

但是,由於Ruby不知道@login_page是或@home_page是什麼類型的對象,因此您沒有獲得任何顯示給定頁面可用方法的智能感知的好處。

任何人都知道一個很好的解決方法?

+0

黃瓜世界變量用作頁面對象(例如@login_page)被認爲是一個壞實踐。如果你需要一個頁面,最好創建一個追蹤@some_page狀態的步驟。這個話題中的葫蘆文檔和例子並不是很好。 – jmoody

回答

-1

發現得到這麼多的研究後,開始工作和應用衆所周知的Java/C#/ OBJ - C的原則,以紅寶石的一種方式:

Given(/^I am on the launch page$/) do 
    @launch_page ||= LaunchPage.new 
end 

When(/^I open the set alarm time page$/) do 
    @set_alarm_page = @launch_page.goto_set_alarm_page 
end 

When(/^I open our apps from the home page$/) do 
    @launch_page.navigation_toolbar.open_our_apps 
end 

Then(/^I should see the homepage alarm time is (\d+)$/) do |alarm_time| 
    alarm_time_actual = @launch_page.get_alarm_time 
    assert_equal(alarm_time, alarm_time_actual) 
end 

只要某處步驟定義類顯式創建新頁面對象(在上面的例子中:LaunchPage.new),然後所有後續頁面將提供intellisense方法/屬性值,因爲返回的結果頁面類型將由RubyMine知道。

3

儘管我欣賞和應用PO設計模式,但我不同意頁面對象返回頁面對象。頁面對象應該是獨立的,不需要了解其他頁面對象。看兩個例子:

  • 您測試表單驗證。點擊提交按鈕返回工作流程中後續的頁面對象,但在這種情況下,您仍然在頁面上顯示驗證錯誤。你的頁面對象不會知道它,並會返回其他頁面。
  • 單擊某個按鈕後,您可能會根據上下文(例如,您從其他頁面到達當前頁面)得到的頁面有所不同。它可能導致實際上具有相同方法的多個版本,這將根據上下文返回不同的頁面對象。這不好,過於複雜簡單的事情。

如果您想返回當前頁面對象,您可以從中受益,例如,在Java中,當您在方法結束時返回this。然後,只要您在同一頁面上,就可以鏈接您執行的所有方法。但是當涉及到「如何實現返回不同的頁面對象」這個問題時,答案很簡單 - '不要'。請注意您引用的wiki條目尚未更新一段時間,最佳實踐自最初發布以來已經有所發展。

+1

使用多個測試人員運行自動化項目時,能夠使用代碼返回類型將頁面「串」在一起是非常有用的。因此,假設我確實想要返回頁面對象,任何想法如何? –

+0

上面的第1點:簡單地創建兩種類型的方法(例如,返回下一頁的validSubmission()和返回錯誤頁面的invalidSubmission()。上面的第2點:只需在類中創建一個私有方法,所有你需要的公共方法。非常輕微的複雜性恕我直言,因爲頁面串的重要好處。 –

0

另一種方法如下。不是整齊,因爲我想(因爲需要手動創建後續頁面的新實例),但可作爲另一種選擇:

When(/^I buy a movie from the movie page$/) do 
    movie_page = MoviePage.new 
    movie_page.buyMovie("Test Movie") 
    purchase_page = PurchasePage.new 
    purchase_page.confirmPurchase 
end