2010-10-08 12 views
30

Nous avons un problème sur notre site e-commerce où les utilisateurs frappent parfois deux fois "checkout" et ont deux fois leur carte chargée.Comment puis-je simuler le bouton de retour du navigateur dans Capybara?

C'est un bug assez commun et facile à réparer, mais je voudrais tester la solution dans notre configuration de capybara. Une fois que j'ai appelé click_button ('checkout'), est-il possible pour moi de prétendre que je suis un utilisateur qui appuie sur le bouton de retour des navigateurs et que j'appelle click_button ('checkout') une seconde fois?

Répondre

2

J'ai utilisé cette méthode dans Webrat. Je suis sûr que quelque chose de similaire pour Capybara fonctionnerait.

When(/^I go back$/) do 
    visit request.env['HTTP_REFERER'] 
end 

Note secondaire: la méthode "redirect_to: back" n'a pas fonctionné pour moi pour une raison quelconque.

+1

sauf que cela rechargera la page précédente (contrairement au bouton de retour du navigateur), j'espère juste accéder à nouveau à la source. –

36

Vous pouvez essayer:

When(/^I go back$/) do 
    page.evaluate_script('window.history.back()') 
end 

Cela nécessitera l'exécution du senario dans un pilote javascript capable (sélénium/Celerity/akephalos)

1

Merci! Cette question et réponse m'a beaucoup aidé!

Juste pour ajouter @Jake la réponse de Mallory, le sélénium fait maintenant partie de capybara et vous pouvez exécuter assez facilement javascript dans le test en ajoutant :js => true (et peut-être un ou deux autres tweaks) comme décrit dans ces deux tutoriels:

http://www.opinionatedprogrammer.com/2011/02/capybara-and-selenium-with-rspec-and-rails-3/ http://railscasts.com/episodes/257-request-specs-and-capybara?view=asciicast

8

vous pouvez utiliser page.driver.go_back, si vous utilisez WebKit comme capybara javascript pilote via le petit bijou capybara-webkit. Nécessite également :js => true pour le scenario.

+0

Fonctionne également avec Selenium comme pilote JavaScript Capybara. – ctc

2

Au moins avec capybara2.10 et selenium-webdriver ceci fonctionne:

When(/^I go back$/) do 
    page.go_back 
end 

Il est essentiellement un raccourci pour jbarr's réponse. Pour plus de détails voir le capybara documentation on go_back. La partie compteur est page.go_forward.