ruby on rails - ¿Cómo reutilizo las sesiones de Capybara entre las pruebas?




ruby-on-rails session (3)

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/

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


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




capybara