2013-04-05 74 views
3

我最近通過rubyweekly電子郵件發現了SitePrism。 它看起來很神奇。我可以看到它將成爲未來。使用SitePrism與Rspec和水豚功能規格

我見過的例子大多是黃瓜步驟。 我想弄清楚如何使用rspec使用SitePrism。

假設@home_page的主頁,@login_page爲login_page 我可以理解,

@home_page.load # => visit @home.expanded_url 

然而,部分我不知道,如果是我想點擊例如「登錄「鏈接,並且Capybara中的瀏覽器進入登錄頁面 - 然後我可以如何訪問登錄頁面的一個實例,而無需加載它。

@home_page = HomePage.new 
    @home_page.load 
    @home.login_link.click 
    # Here I know the login page should be loaded, so I can perhaps do 

    @login_page = LoginPage.new 
    @login_page.should be_displayed 
    @login_page.email_field.set("[email protected]") 
    @login_page.password_field.set("password") 
    @login_page.submit_button.click 

etc... 

這似乎是可能的工作。所以,當你知道你應該在一個特定的頁面上時,你會創建一個該頁面的實例,並以某種方式在水豚「頁面」上下文中,如page.find(「a [href ='/ sessions/new']] 「)被轉移到最後一個SitePrism對象?

我只是覺得我在這裏失去了一些東西。 我會玩弄,看看我能弄清楚 - 只是想到我可能會錯過一些東西。 我正在查看源代碼,但是如果有人已經想通了......請隨時分享:)

+0

爲什麼你不想把登錄方法放在頁面對象中? – 2013-04-06 14:04:54

+0

您可能錯過了這個問題的要點... – 2013-04-06 14:37:09

+0

你能顯示你的功能/支持/ env.rb文件嗎? – bmalets 2013-10-04 09:21:10

回答

4

你認爲什麼是SitePrism的工作方式:)雖然你可能想要檢查自述文件的結尾部分解釋瞭如何避免您必須在整個測試代碼中實例化頁面對象。這裏有一個例子:

# our pages 

class Home < SitePrism::Page 
    #... 
end 

class SearchResults < SitePrism::Page 
    #... 
end 

# here's the app class that represents our entire site: 

class App 
    def home 
    Home.new 
    end 

    def results_page 
    SearchResults.new 
    end 
end 

# and here's how to use it: 

#first line of the test... 
@app = App.new 
@app.home.load 
@app.home.search_field.set "sausages" 
@app.home.search_button.click 
@app.results_page.should be_displayed 
+0

我不太喜歡這種模式,每個'home'的調用都會返回一個新的對象。我寧願保留頁面對象內頁面當前狀態的知識 – 2013-04-06 09:08:50

+1

它看起來上面的代碼違反了[頁面對象](https://code.google.com/p/selenium/wiki/PageObjects)的一些原則, :「儘量不要暴露頁面的內部」,「公共方法代表頁面提供的服務」。答案中的代碼公開'search_field'和'search_button'。它應該是具有簽名的服務方法,例如而不是搜索(關鍵字)。 – 2013-04-06 14:15:46

+1

我迄今使用過的方式是將頁面對象視爲當前頁面的主持人。因此,我不會用css選擇器拋棄我的rspec功能,如果它發生變化,我必須在各個地方更新,我可以在一個地方定義它。每當我在頁面上時,我仍然對構成元素的內容承擔責任。雖然我可能會使用它。 – Apie 2013-04-07 12:56:43