2010-12-01 3 views
31

Я пишу некоторые тесты RSpec для моего приложения Rails 3 и пытаюсь переключиться с Webrat на Capybara. Пока что так хорошо, но приложение использует HTTP basic auth для авторизации моего администратора, любая идея, как я могу проверить это с Capybara?HTTP basic auth для Capybara

Вот мой текущий шаг Webrat:

it 'should authenticate for admin' do 
    basic_auth('user', 'secret') 
    visit '/admin' 
    response.status.should eql 200 
    response.status.should_not eql 401 
end 

Как это сделать с Капибара? Благодаря!

ответ

39

Я получил его на работу, используя page.driver.basic_authorize(name, password) вместо

Update:

В настоящее время, после обновления Капибара, я использую эту кучу обходные:

if page.driver.respond_to?(:basic_auth) 
    page.driver.basic_auth(name, password) 
elsif page.driver.respond_to?(:basic_authorize) 
    page.driver.basic_authorize(name, password) 
elsif page.driver.respond_to?(:browser) && page.driver.browser.respond_to?(:basic_authorize) 
    page.driver.browser.basic_authorize(name, password) 
else 
    raise "I don't know how to log in!" 
end 
+1

Круто, это работает! Для справки в будущем: я нашел комментарий Джонаса Никласа, создателя Capybara, не рекомендуя использовать драйвер, поскольку не все возможные драйверы Capybara поддерживают HTTP-заголовки (https://github.com/jnicklas/capybara/issues/issue/17) ... если кому-то это понадобится. Насколько мне известно, это решение, в котором я нуждаюсь. Спасибо Андерсу! – Cimm 2010-12-03 20:58:22

+2

`page.driver.browser.basic_authorize` работал для меня. Спасибо!!! – 2015-01-09 17:52:59

+0

Ты рок! `page.driver.browser.basic_authorize` работал для меня – 2017-03-23 23:52:23

1

I должен был сделать этот ужасный хак, чтобы заставить его работать без головы и с javascript

Given /^I am logged in$/ do 
if page.driver.respond_to?(:basic_authorize) 
    page.driver.basic_authorize('admin', 'password') 
else 
    # FIXME for this to work you need to add pref("network.http.phishy-userpass-length", 255); to /Applications/Firefox.app/Contents/MacOS/defaults/pref/firefox.js 
    page.driver.visit('/') 
    page.driver.visit("http://admin:[email protected]#{page.driver.current_url.gsub(/^http\:\/\//, '')}") 
end 
end 
2

Это изменилось в последних версиях огуречных рельсов (я использую 1.0.2).

Огурец-рельсы по умолчанию использует драйвер стойки/теста, поэтому, если вы его не изменили, будут работать следующие инструкции.

Создать особенности/step_definitions/authorize.rb:

Given /^I am logged in as "([^\"]*)" with "([^\"]*)"$/ do |username, password| 
    authorize username, password 
end 

Теперь вы можете использовать это в своих функций:

Given I am logged in as "admin" with "password" 
+0

Спасибо Joost, но в вопросе не упоминался огурец. Это был вопрос Капибары. Приятно знать, что в Cucumber есть простой способ сделать это. – Cimm 2011-08-02 13:11:43

24

Драйвер Капибара по умолчанию, стойка-тест, имеет метод basic_authorize (с псевдонимом authorize) для Basic HTTP Auth и digest_authorize для дайджеста HTTP Auth, здесь вы можете найти их: https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb

Так что вы можете сделать:

page.driver.browser.authorize 'login', 'password' 

Или вы можете написать простой помощник для Basic HTTP Auth:

def basic_auth(user, password) 
    encoded_login = ["#{user}:#{password}"].pack("m*") 
    page.driver.header 'Authorization', "BasiC#{encoded_login}" 
end 
2

Ни один из page.driver.* решений не работает для меня. Я использую Poltergeist, а не Selenium, так что это может иметь какое-то отношение к этому. Вот что сделали работу:

RSpec.shared_context "When authenticated" do 
    before do 
    username = 'yourusername' 
    password = 'yourpassword' 
    visit "http://#{username}:#{password}@#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}/" 
    end 
end 

Тогда в вашей спецификации:

feature "Your feature", js: true do 
    include_context "When authenticated" 

    # Your test code here... 
end 
0

Людей, ни одно из этих решений не работали для меня.

Решение Pistos подошло близко и работало для спецификаций функций с js: true, но не получилось без подголовника.

Это нижеследующее решение работает для меня для и без головы и js: true.

спецификации/поддержка/when_authenticated.rb

RSpec.shared_context 'When authenticated' do 
    background do 
    authenticate 
    end 

    def authenticate 
    if page.driver.browser.respond_to?(:authorize) 
     # When headless 
     page.driver.browser.authorize(username, password) 
    else 
     # When javascript test 
     visit "http://#{username}:#{password}@#{host}:#{port}/"  
    end 
    end 

    def username 
    # Your value here. Replace with string or config location 
    Rails.application.secrets.http_auth_username 
    end 

    def password 
    # Your value here. Replace with string or config location 
    Rails.application.secrets.http_auth_password 
    end 

    def host 
    Capybara.current_session.server.host 
    end 

    def port 
    Capybara.current_session.server.port 
    end 
end 

Тогда в вашей спецификации:

feature 'User does something' do 
    include_context 'When authenticated' 

    # test examples 
end