これが私の完全な仕様です:
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
それがない(:all)
場合 (つまり、before
最初のブロックにある場合)、ブラウザーが開き、[ログイン] リンクをクリックして、正しいページに移動し、リンクをクリックします。良い。
しかし、2 番目のリンク ("Claim") をクリックする前にもう一度やり直します。これには時間がかかり、エラーが発生しやすくなります。だから私はこれを修正しようとしましたbefore(:all)
。
しかし今では、Firefox を開き、しばらく待ってから、何もせずに再び閉じます。テストに失敗しました:
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)>'
明らかに、ブラウザのページが空白だったからです。
私は何が欠けていますか?ありがとうございました。
編集:私が理解していない基本的なことがあるかもしれません。before(:each)
テストがしようとしていることは次のとおりです。
1) Web アプリにログインし、[請求] ボタンがあることを確認します。
2) webapp に再度ログインし、アコーディオンを再度開き、 「Claim」ボタンをクリックして何が起こるかを確認します。
したがって、すべてのステップの始まりはまったく同じで、ブラウザは同じことを何度も繰り返します。それが本来あるべき姿ですか?
その場合、これを行うとエラーが発生するのはなぜですか? 具体的には、次のbefore(:each)
ようになります。
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)>'
ブラウザがボタンをクリックして「Claimed」に切り替えているのを確認しても、モーダル ダイアログは表示されません。
編集2:私は訂正されたままです!結局、そこにはモーダル ダイアログがありました。表示を停止するように JS を修正したところ、テストに合格するようになりました。フレームワークがすべてのステップでシーケンス全体をゼロから繰り返さなければならないのは奇妙だと思います (作業の無駄のように思えます) が、何でも構いません。ありがとうございました!