ruby-on-rails session cookies capybara

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?



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