Hier ist meine vollständige Spezifikation:
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
Ohne (:all)
(d.h., wenn es sich nur um before
im ersten Block), öffnet sich der Browser, klickt auf den Login-Link, geht auf die richtige Seite und klickt auf den Link. Schön.
Aber dann wird das Ganze noch einmal wiederholt, bevor versucht wird, den zweiten Link ("Claim") anzuklicken, was sowohl zeitaufwändig als auch fehleranfällig ist. Also habe ich versucht, dies zu beheben mit before(:all)
.
Aber jetzt öffnet er einfach Firefox, wartet einen Moment und schließt ihn dann wieder, ohne etwas zu tun. Test fehlgeschlagen sagen:
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)>'
Offensichtlich, denn die Browser-Seite war leer.
Was vermisse ich? Ich danke Ihnen.
Edita: Vielleicht gibt es etwas Grundlegendes, das ich nicht verstehe. Mit before(:each)
Das versucht der Test zu erreichen:
1) Loggen Sie sich in die Webapp ein und vergewissern Sie sich, dass es eine Schaltfläche "Claim" gibt.
2) Melden Sie sich bei der Webapplikation an. wieder , öffnen Sie das Akkordeon wieder und klicken Sie jetzt auf die Schaltfläche "Antrag", um zu sehen, was passiert.
Der Anfang eines jeden Schrittes ist also genau derselbe, der Browser macht immer wieder dasselbe. Ist das so gewollt?
Wenn ja, warum erhalte ich Fehler, wenn ich dies tue? Genauer gesagt, mit before(:each)
Ich verstehe das:
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)>'
Obwohl ich sehe, dass der Browser auf die Schaltfläche klickt und sie auf "Beansprucht" stellt, wird kein modales Dialogfeld angezeigt.
Bearbeiten 2: Ich nehme alles zurück! Dort war doch einen modalen Dialog! Ich habe das JS so korrigiert, dass es nicht mehr angezeigt wird, und der Test funktioniert jetzt. Ich denke immer noch, es ist seltsam, dass der Rahmen hat, um die ganze Sequenz von Grund auf jeden Schritt zu wiederholen (scheint wie eine Verschwendung von Arbeit), aber egal. Vielen Dank an Sie!