1

Twitter Bootstrap とポルターガイストを使用しています。モバイル解像度のいくつかの要素を非表示にしようとしています。次に例を示します。

見る:

<th class="hidden-phone">Email</th> ....

CSS:

.hidden-phone {
  display: none !important;
}

仕様:

context 'Phone', js: true do
  it 'should hide some elements' do
    page.driver.resize 320, 480
    visit my_path

    within '#members_list thead tr' do
      expect(page).not_to have_content 'Email'
    end
  end
end

しかし、テストはパスしません:

Failure/Error: expect(page).not_to have_content 'Email'
   expected content "Email" not to return anything

何が間違っている可能性がありますか? page.driver.render 要素でスクリーン ダンプを作成すると、要素が非表示になります。

4

2 に答える 2

1

methodのデフォルト オプションはhave_content、非表示のコンテンツを無視して、すべてのテキストを検索します。

試す

expect(page).not_to have_content(:visible, 'Email')

ドキュメントはこちらhttp://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_text%3F-instance_method

于 2013-06-03T20:30:50.173 に答える
0

あなたの例からの私の推測では、要素はJavaScriptまたは非同期動作を使用して隠されているため、アサートが評価されているときにまだ表示されている可能性があります。

要素が非表示または非表示になるのを待つために、非同期動作を適切にサポートする Build in Capybara API (Capybara を使用していると想定しています) を使用できます。したがって、アサートを使用する代わりに:

expect(page).not_to have_content 'Email'

あなたが使用することができます:

page.should_not have_selector("#members_list thead tr", :text => "Email")

また:

page.find("#members_list thead tr").should_not have_content("Email")

CSS セレクターが、評価している要素に従っていることを確認してください。

これら 2 つの構造がどのように機能するか、または動作するかについての詳細な説明については、次の参考文献を参照して ください

また、要素が遅い AJAX リクエストを待機しているために要素が非表示になるまでに時間がかかる場合は、ファイルで次のように指定して、要素が返されるCapybaraまでの待機時間を増やすことができます。TimeOutErrorspec_helper.rb

Capybara.default_wait_time = 30

また、poltergeistタイムアウトを与える前にドライバーにさらに時間を待つように指示します。

Capybara::Poltergeist::Driver.new(app, { timeout: 40 }
于 2013-06-07T22:02:36.853 に答える