0

私はボタンは、ブートストラップポップオーバーであり、それがうまく機能走る機能(5B3 Railsの)Capybara Railsを使ってBootstrap Popoverと対話する方法は?

ボタンを押すと、DBに新しいレコードを挿入することをテストしようとしています。しかし、私はそれをテストしようとすると、私は要素をターゲットにすることはできません。

ポップオーバーのコンテンツは、デフォルトではDOMにはなく、ボタンをクリックすると挿入され、削除されます。これは、ここに私のテストの宝石セットのブートストラップv4の

のデフォルトの動作です:

gem "rails-controller-testing", :git => "https://github.com/rails/rails-controller-testing" 
    gem 'launchy' 
    gem 'poltergeist' 
    gem 'rspec', '~> 3.5.0.beta1' 
    gem 'rspec-core', '~> 3.5.0.beta1' 
    gem 'rspec-rails', '~> 3.5.0.beta1' 
    gem 'guard-rspec', '~> 4.6', require: false 
    gem 'capybara' 
    gem 'factory_girl_rails' 

は、ここで私がターゲットにしようとしているポップオーバーによって挿入された、関連するHTMLです:

<button data-js-method="createblock" class='btn btn-secondary btn-block'>Heading</button> 

そしてここにはあります私のテスト:

scenario 'Popover#Heading' do 
    before_count = HeadingBlock.count 
    # This clicks the button to activate the popover 
    find('.btn-add-block').click 

    # The line below is what I'm trying to target 
    # click_button('Heading') yields 'Unable to find button "Heading"' 
    find('button [data-js-method="createblock"]').click 
    after_count = HeadingBlock.count 

    expect(after_count - before_count).to eq(1) 
end 

最後に、エラー:

Capybara::ElementNotFound: 
     Unable to find css "button [data-js-method=\"createblock\"]" 

答えて

0

CSSセレクタでは、スペースは子孫を見つけることを意味しますが、ボタン要素の属性に一致するようにしています。したがって、それは私はあなたがそれをしようとしたときに何を得るエラーを示すものではありませんので、(「見出し」)click_buttonはあなたのために働いていない理由はわからない

find('button[data-js-method="createblock"]').click #no space between button and [data-.... 

でなければなりません。

次は、ボタンをクリックすると処理に時間がかかることがあるため、すぐにカウントを取得するのが不安定になる可能性があります。あなたはcapybaras待機/再試行動作があなたのために働くことができるようにexpect(page).to have_selector('whatever selector', count: before_count+1)を使用している必要があります - 私はHeadingBlockが定義されているか分からないので、そのセレクタが何であるべきかわかりません。

+0

CSSセレクタを使用すると同じ結果が得られます。 click_button( '見出し')を使用すると「見付からないボタン」見出しが表示されます。私はあなたのポストの後半を理解していません。 HeadingBlockはモデルで、ボタンを押すとデータベースに新しいエントリが作成されたかどうかを確認します。 詳しい説明はありますか? –

+0

セレクタにも「Unable to find」と表示されている場合は、ページ上にボタンが表示されません。ボタンを表示させるために何か別のアクションを実行する必要はありませんか、それともCapybara.default_max_wait_timeを何に設定しても何よりも時間がかかりますか?それをテストするには、 'click_button( 'Heading'、wait:20)'を実行して、動作していることを確認します。次の問題は、 '#click'は非同期であるため、呼び出し直後にデータベースをチェックしても、新しいレコードを作成するためのアプリ時間はありません。代わりに、画面に表示される変更をチェックするときにテストするとずっと良いです... –

+0

データベース内の項目を数えます。だから、ページに表示されたら、新しい見出しを作成し、データベースアイテムを数えるのではなく、have_selectorでチェックしてください。そうすれば、カピバラは変更が表示されるまで待つことができます。そうでなければ、クリックカウントとデータベースカウントコールの間にスリープが必要です。アクションは終了することができます。データベースのカウントを強くお勧めする場合は、https://github.com/abotalov/waiting_rspec_matchersの 'become_eq'マッチャーを見てください。これは、' expect {HeadingBlock.count} .toto_eq(before_count + 1) ' –

関連する問題