ruby on rails - ¿Cómo reutilizo las sesiones de Capybara entre las pruebas?
ruby-on-rails session (4)
Quiero seguir usando la misma sesión y con eso me refiero a la sesión de Rails entre varias Test::Unit
integración de Test::Unit
que usan Capybara. El objeto Capybara::Session
es el mismo en todas las pruebas que se reutiliza, pero cuando accedo a otra página en otra prueba, me desconecto de inmediato.
Al excavar encontré que capybara_session.driver.browser.manage.all_cookies
se borra entre una prueba y la siguiente.
¿Alguna idea de cómo? ¿o por qué? ¿O cómo evitarlo?
Intentando solucionarlo, guardé la cookie en una variable de clase y la volví a agregar más tarde ejecutando:
capybara_session.driver.browser.manage.add_cookie(@@cookie)
y parece que funciona, la cookie está ahí, pero cuando hay una solicitud, la cookie se reemplaza por otra, por lo que no tuvo efecto.
¿Hay alguna otra manera de lograr esto?
Agregue lo siguiente después de su código de capibara que interactúa con la página:
Capybara.current_session.instance_variable_set(:@touched, false)
or
page.instance_variable_set(:@touched, false)
Si eso no funciona, esto podría ayudar:
https://github.com/railsware/rack_session_access
http://collectiveidea.com/blog/archives/2012/01/05/capybara-cucumber-and-how-the-cookie-crumbles/
Puede evitar la llamada a @browser.manage.delete_all_cookies
que ocurre entre pruebas parcheando el parche Capybara::Selenium::Driver#reset!
método. No es una forma limpia de hacerlo, pero debería funcionar ...
Agregue el siguiente código a su proyecto para que se ejecute después de que require ''capybara''
:
class Capybara::Selenium::Driver < Capybara::Driver::Base
def reset!
# Use instance variable directly so we avoid starting the browser just to reset the session
if @browser
begin
#@browser.manage.delete_all_cookies <= cookie deletion is commented out!
rescue Selenium::WebDriver::Error::UnhandledError => e
# delete_all_cookies fails when we''ve previously gone
# to about:blank, so we rescue this error and do nothing
# instead.
end
@browser.navigate.to(''about:blank'')
end
end
end
Para interés, la línea ofensiva se puede ver en el código base de Capybara aquí: https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71
Puede valer la pena publicar la razón por la que necesita este tipo de comportamiento. Por lo general, tener la necesidad de parchear el capibara es una indicación de que está intentando usarlo para algo para lo que no estaba destinado. A menudo es posible reestructurar las pruebas, para que no necesite que las cookies permanezcan en las pruebas de integración.
Si lo que estás haciendo es tratar de juntar ejemplos individuales en una historia (estilo pepino, pero sin pepino), puedes usar una gema llamada rspec-steps para lograr esto. Por ejemplo, normalmente esto no funcionará:
describe "logging in" do
it "when I visit the sign-in page" do
visit "/login"
end
it "and I fill in my registration info and click submit" do
fill_in :username, :with => ''Foo''
fill_in :password, :with => ''foobar''
click_on "Submit"
end
it "should show a successful login" do
page.should have_content("Successfully logged in")
end
end
Porque rspec deshace todas sus variables de instancia, sesiones, cookies, etc.
Si instala rspec-steps (nota: actualmente no es compatible con rspec más reciente que 2.9), puede reemplazar ''describe'' con ''pasos'' y Rspec y capybara mantendrán el estado entre los ejemplos, lo que le permite construir una historia más larga, por ejemplo:
steps "logging in" do
it "when I visit the sign-in page" #... etc.
it "and I fill in" # ... etc.
it "should show a successful" # ... etc.
end