4

これが私の完全な仕様です:

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 を修正したところ、テストに合格するようになりました。フレームワークがすべてのステップでシーケンス全体をゼロから繰り返さなければならないのは奇妙だと思います (作業の無駄のように思えます) が、何でも構いません。ありがとうございました!

4

1 に答える 1

2

これは、capybara のセッション データ (ログイン状態など) を含むテスト データと、によって作成されたモデルcreate(:idea)が仕様間でワイプされるためです。

時間がかかりますが、before(:each)notを使用したいと考えています。:all

于 2013-01-16T18:12:14.440 に答える