45 votes

Capybara ne passe pas l'en-tête après la soumission du formulaire

Je suis la construction d'un Rails de 3 app qui rend différents points de vue pour les appareils mobiles (à l'aide de jQuery Mobile) et les navigateurs de bureau. Je suis en train de tester avec du Concombre/Capybara, et de séparer les suites de test pour mobile et navigateur. Je suis en mesure de définir un mobile chaîne de l'Agent Utilisateur dans la requête HTTP en-tête de l'amende juste à l'aide de la "en-têtes hack" qui se trouve ici...

À l'aide de Concombre/Capybara dans Rails 3, comment puis-je personnaliser la chaîne User-Agent?

Le Problème...

La plupart de mes mobiles de Concombre étapes de fonctionner correctement (par exemple, j'ai mis le mobile-tête en une étape, par la suite, les affichages mobiles de rendu). Cependant, après la soumission d'un formulaire, le test, puis rend un navigateur en vue de la prochaine étape (pas la vue mobile je veux). Je pense que cela peut-être parce que le Capybara est de faire tomber la tête à la suite d'un formulaire de soumission de l'action.

J'ai essayé de le tester en ajoutant un enregistreur de frappe pour mon contrôleur d'action pour que je puisse voir le user_agent en-têtes, comme suit:

def show
    # …
    logger.info("Headers: #{request.user_agent}")
    # …
end

J'ai utilisé un iPhone en-tête (l'Acheteur est la ressource). Dans mon test.journal que je vois:

Pour l'action de création...

Started POST "/buyers" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#create as HTML
  #...
Headers: Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
  #...
Redirected to http://www.example.com/buyers/1
Completed 302 Found in 7ms

Pour la suite de l'action (note "en-Têtes:" est vide)...

Started GET "/buyers/1" for 127.0.0.1 at 2011-04-19 16:49:18 -0700
Processing by BuyersController#show as HTML
 #...
Headers: 
 #...
Completed 200 OK in 4ms (Views: 2.8ms | ActiveRecord: 1.4ms)

Comme on pouvait s'y attendre, le ‘me montrer la page' étape rend alors dans la page du navigateur, pas le mobile de la page que je veux.

Comment puis-je préserver l'en-tête de sorte que tous mes mobiles étapes se déroulent dans mon mobile de la suite de tests?

Mise à jour

Jnicklas (créateur de la vraiment génial Capybara bijou!) répond:

"C'est plus une question qu'un problème, tbh. En Rack-Test il n'existe actuellement aucun moyen de la réalisation de ce court of monkey patching que je suis au courant. J'ai pensé à l'ajout d'un en-tête de l'option à la baie-pilote d'essai, ce qui permettrait le passage à des différentes options d'en-tête. Si vous utilisez beaucoup de JavaScript, le Sélénium pourrait être un meilleur ajustement de toute façon et vous permet de configurer l'agent de l'utilisateur librement, autant que je me souvienne."

https://github.com/jnicklas

https://github.com/jnicklas/capybara

5voto

christiangeek Points 549

Cette fonctionnalité a été ajoutée à Capybara, le 25 avril, 2011 - validation https://github.com/jnicklas/capybara/commit/a00435d63085ac2e74a0f64e7b7dedc0f7252ea9

Vous pouvez maintenant spécifier un en-tête personnalisé lors de l'utilisation d'une coutume Capybara pilote. Voir http://automagical.posterous.com/creating-a-custom-capybara-driver pour des exemples de code.

2voto

Peter Ehrlich Points 2415

Voici comment nous avons résolu le problème, afin de travailler également avec javascript (remarque: utilisez remove_headers dans votre bloc After ):

 module CapybaraHeadersHelper
  def add_headers(headers)
    headers.each do |name, value|
      case page.driver.class.to_s
      when "Capybara::RackTest::Driver"
        page.driver.options[:headers] ||= {}
        page.driver.options[:headers][name.to_s] = value

      when "Capybara::Driver::Webkit"
        page.driver.browser.header name, value

      end
    end
  end

  def remove_headers(headers)
    headers.each do |name|
      case page.driver.class.to_s
      when "Capybara::RackTest::Driver"
        page.driver.options[:headers] ||= {}
        page.driver.options[:headers].delete name.to_s

      when "Capybara::Driver::Webkit"
        page.driver.browser.header name, nil

      end
    end
  end
end

World(CapybaraHeadersHelper)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X