3 votes

Capybara et before(:all) dans rspec

Voici mon cahier des charges complet :

require 'spec_helper'

describe "Idea page", js: true do

  subject { page }

  before(:all) do
    create(:idea)
    visit root_path
    click_link "Log In"
  end

  context "Single idea" do
    before do
      page.find(:xpath, '//*[@id="accordion"]/div/div[1]/a').click
    end

    it { should have_selector('a',text:'Claim') }
    it "should have a button for reporting the idea"
    it "should have a button for opening all links"

    describe "Claiming" do
      before do
        click_link "Claim"
      end
      it {should have_selector('a', text:'Claimed')}
    end

  end
end

Sans (:all) (c'est-à-dire, quand il s'agit juste de before dans le premier bloc), le navigateur s'ouvre, clique sur le lien Connexion, se rend sur la bonne page et clique sur le lien. Bien.

Mais il recommence avant de cliquer sur le deuxième lien ("Claim"), ce qui prend du temps et entraîne des erreurs. J'ai donc essayé de résoudre ce problème avec before(:all) .

Mais maintenant, il ouvre simplement Firefox, attend un moment, puis le referme sans rien faire. Le test échoue :

Failures:

  1) Idea page Single idea 
     Failure/Error: page.find(:xpath, '//*[@id="accordion"]/div/div[1]/a').click
     Capybara::ElementNotFound:
       Unable to find xpath "//*[@id=\"accordion\"]/div/div[1]/a"
     # ./spec/features/ideas_spec.rb:15:in `block (3 levels) in <top (required)>'

  2) Idea page Single idea Claiming 
     Failure/Error: page.find(:xpath, '//*[@id="accordion"]/div/div[1]/a').click
     Capybara::ElementNotFound:
       Unable to find xpath "//*[@id=\"accordion\"]/div/div[1]/a"
     # ./spec/features/ideas_spec.rb:15:in `block (3 levels) in <top (required)>'

Évidemment, puisque la page du navigateur était vide.

Qu'est-ce que je rate ? Merci.

Edit : Il y a peut-être quelque chose de fondamental que je ne comprends pas. Avec before(:each) Voici ce que le test essaie de faire :

1) Connectez-vous à la webapp, assurez-vous qu'il y a un bouton "Claim".

2) Connectez-vous à la webapp à nouveau Ouvrez l'accordéon. à nouveau et cliquez maintenant sur le bouton "Réclamer" pour voir ce qui va se passer.

Ainsi, le début de chaque étape est exactement le même, le navigateur faisant la même chose encore et encore. C'est comme ça que c'est censé être ?

Si c'est le cas, pourquoi est-ce que j'obtiens des erreurs lorsque je fais cela ? Plus précisément, avec before(:each) Je comprends :

Failures:

  1) Idea page Single idea Claiming 
     Failure/Error: it {should have_selector('a', text:'Claimed')}
     Selenium::WebDriver::Error::UnhandledAlertError:
       Modal dialog present
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/command_processor.js:10287:in `nsCommandProcessor.execute'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:7328:in `Dispatcher.executeAs/<'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:7488:in `Resource.handle'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:7435:in `Dispatcher.dispatch'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/driver_component.js:10119:in `WebDriverServer/<.handle'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1935:in `unknown'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:2261:in `ServerHandler.handleResponse'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1168:in `Connection.process'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1616:in `RequestReader._handleResponse'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1464:in `RequestReader._processBody'
     # [remote server] file:///tmp/webdriver-profile20130116-3734-lw7267/extensions/fxdriver@googlecode.com/components/httpd.js:1333:in `RequestReader.onInputStreamReady'
     # ./spec/features/ideas_spec.rb:26:in `block (4 levels) in <top (required)>'

Même si je vois le navigateur cliquer sur le bouton, le transformer en "Réclamé", et qu'aucune boîte de dialogue modale ne s'affiche.

Edit 2 : Je me suis trompé ! Voilà était une boîte de dialogue modale, finalement ! J'ai corrigé le JS pour qu'il ne l'affiche plus, et le test passe maintenant. Je pense toujours que c'est bizarre que le framework doive répéter toute la séquence depuis le début à chaque étape (cela semble être un gaspillage de travail), mais peu importe. Merci !

2voto

Daniel Evans Points 4215

En effet, les données de test, y compris les données de session de capybara (telles que l'état de connexion) et le modèle créé par l'application create(:idea) sont effacés entre les spéculations.

Vous voulez aller avec before(:each) pas :all même si cela prend plus de temps.

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