2015-06-26 31 views
15

我已經使用Java的頁面對象模式(https://code.google.com/p/selenium/wiki/PageObjects)構建了各種測試自動化框架。Ruby是否與嚴格的頁面對象模式兼容?

的我已經找到了很大的好處有兩個是:

1)你可以看到什麼方法都可以,當你有一個網頁的一個實例(如打字homepage.會告訴我所有的動作/方法,你可以調用從主頁)

2)因爲導航方法(例如goToHomepage())返回後續頁面的實例(例如主頁),您可以簡單地通過編寫代碼並查看您的位置來瀏覽測試。

例如

WelcomePage welcomePage = loginPage.loginWithValidUser(validUser); 
PaymentsPage paymentsPage = welcomePage.goToPaymentsPage(); 

這些優勢與Java因爲對象(或頁面在這種情況下)的類型完美地工作是由IDE聞名。

但是,在Ruby中,對象類型在任何時候都不固定,並且通常對IDE來說不明確。因此,我看不出如何在使用Ruby構建的自動化套件(例如使用Cucumber)上實現這些優勢。

任何人都可以告訴我如何使用Ruby與頁面對象模式來獲得這些好處?

回答

3

從聊天的同事們,我懷疑下面可能是最好的解決辦法(但如果一個更好的解決方案存在,請發佈一個備選答案):

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 

所以在上面的例子中,我們沒有返回的情況下,後續頁面瀏覽頁面時(因爲返回的頁面只是未知類型的對象)。此外,我們需要創建一個新的實例(使用「.new」),以便至少我們可以獲得鍵入「movie_page」的智能優勢。並查看該頁面有哪些操作/方法可用。

有沒有人有更好的解決方案?

+2

這是我在紅寶石中使用的方法。我認爲這是最明智的工作方式。但是我確實定義了'@movie_page || = MoviePage.new',這樣我就可以在其他步驟中重用頁面對象實例,而不需要創建比我需要的更多的對象。此外,這使您可以在該頁面的實例中的步驟之間存儲變量。總的來說,我避免了這種情況,因爲從維護POV來看,它並不總是清楚它的設置位置,但在某些情況下,它使用起來比在黃瓜步驟中使用許多@variables更容易。 – alannichols

9

從一些進一步的調查,它看起來像最初的要求可以用實例變量來實現:

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方法/屬性值。

6

我使用Spinach而不是黃瓜 - 它幾乎完全相同,但是這些步驟都包含在該特徵文件所特有的類中 - 所以在當前作用域之外沒有任何對象泄漏。

https://github.com/codegram/spinach

+0

請爲您提到的資源添加鏈接,儘可能提供幫助。 –

+0

用鏈接編輯:-) –