私はボタンは、ブートストラップポップオーバーであり、それがうまく機能走る機能(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\"]"
CSSセレクタを使用すると同じ結果が得られます。 click_button( '見出し')を使用すると「見付からないボタン」見出しが表示されます。私はあなたのポストの後半を理解していません。 HeadingBlockはモデルで、ボタンを押すとデータベースに新しいエントリが作成されたかどうかを確認します。 詳しい説明はありますか? –
セレクタにも「Unable to find」と表示されている場合は、ページ上にボタンが表示されません。ボタンを表示させるために何か別のアクションを実行する必要はありませんか、それともCapybara.default_max_wait_timeを何に設定しても何よりも時間がかかりますか?それをテストするには、 'click_button( 'Heading'、wait:20)'を実行して、動作していることを確認します。次の問題は、 '#click'は非同期であるため、呼び出し直後にデータベースをチェックしても、新しいレコードを作成するためのアプリ時間はありません。代わりに、画面に表示される変更をチェックするときにテストするとずっと良いです... –
データベース内の項目を数えます。だから、ページに表示されたら、新しい見出しを作成し、データベースアイテムを数えるのではなく、have_selectorでチェックしてください。そうすれば、カピバラは変更が表示されるまで待つことができます。そうでなければ、クリックカウントとデータベースカウントコールの間にスリープが必要です。アクションは終了することができます。データベースのカウントを強くお勧めする場合は、https://github.com/abotalov/waiting_rspec_matchersの 'become_eq'マッチャーを見てください。これは、' expect {HeadingBlock.count} .toto_eq(before_count + 1) ' –