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 !