2013-04-05 3 views
3

Недавно я обнаружил SitePrism через электронную почту rubyweekly. Это выглядит потрясающе. Я вижу, что это будет будущее.Использование SitePrism с характеристиками функции Rspec и Capybara

Примеры, которые я видел, в основном для шагов огурца. Я пытаюсь выяснить, как можно использовать SitePrism с rspec.

Предполагая @home_page для домашней страницы и @login_page для login_page Я могу понять, что

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

однако, часть я не уверен, если я думаю, нажмите на, например, в " login ", а браузер в 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... 

Кажется, что это может сработать. Итак, когда вы знаете, что вы должны быть на определенной странице, вы создаете экземпляр этой страницы и как-то контекст «страницы» capybara, как и в page.find («a [href = '/ sessions/new»] ") переносится на последний объект SitePrism?

Я просто чувствую, что здесь что-то отсутствует. Я поиграю и посмотрю, что я могу понять - просто подумал, что я могу что-то упустить. Я просматриваю источник, но если кто-то это понял ... не стесняйтесь делиться :)

+0

Почему вы не хотите вводить метод входа в объект страницы? –

+0

Возможно, вы упустили точку вопроса ... –

+0

можете ли вы показать свои функции/файл поддержки/env.rb? – bmalets

ответ

4

Вы, как предполагалось, оказались именно тем, как работает SitePrism :) Хотя вы можете проверить эпилог readme, в котором объясняется, как спасти себя от необходимости создавать объекты страницы по всему тестовому коду. Вот пример:

# 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' возвращает новый объект. Я бы предпочел сохранить knowlegde о текущем состоянии страницы внутри объекта страницы –

+1

Мне кажется, что код выше нарушает некоторые параметры [Объект страницы] (https://code.google.com/p/selenium/wiki/PageObjects) : «Старайтесь не подвергать внутренности страницы», «Публичные методы представляют услуги, которые предлагает страница». Код в ответе предоставляет 'search_field' и' search_button'. Это должен быть метод обслуживания с подписью, например. 'search (keyword)' вместо этого. –

+1

До сих пор я использовал это для обработки объектов страницы не как нечто большее, чем презентатор текущей страницы. Таким образом, вместо того, чтобы засорять мои функции rspec с помощью селекторов css, которые я должен обновлять в разных местах, если он изменится, я могу определить его в одном месте. Я все еще несу ответственность за то, что установлено в элементах, когда я нахожусь на странице. Возможно, я использую это неправильно. – Apie