14

Railsアプリケーションで、ドライバーでCapybaraを使用して、RspecのjQuery TokenInputフィールドでBootstrapモーダルをテストしようとしています。問題の部分は次のとおりです。capybara-webkit

click_link 'Create Team Modal'
sleep 1

within('div#modal_popup') do
  fill_in 'input#token-input-team_name', with: 'Fancy team name'
  sleep 1
  fill_in 'input#token-input-team_name', with: '\t'
  sleep 1

  click_button 'Create Team'
end

page.should have_content('Fancy team name')
  • ボタンをクリックしてモーダルを取得
  • TokenInput にチーム名を入力します
  • Tab キーを押して選択するようにシミュレートする
  • チームを作成する
  • ページに名前が表示されていることを確認する

これは、それらすべてが適切に配置されている場合にのみ機能しsleep 1ます。そうしないと、Capybara が でクラッシュしhave_content、チーム名を正しく選択できなかったため、最終的にサーバー エラーが発生します。ただし、TokenInput フィールドのないその他の Bootstrap モーダルはsleep 1、ロードする前に を必要としません。

そうは言っても、睡眠を取り除き、これを通常どおりに進める方法はありますか? wait_untilCapybara 2は、デフォルトの待機時間内に何かをテストするために待機するため、(正当な理由で)取り出しました...しかし、それは私の上記のテストには反映されていないようです。あたかもこのモーダルに出入りするときに、カピバラがその待機期間に従事していないかのようです。誰でもこれを経験したことがありますか?Rails 3.2.10、Rspec 2.12、Capybara 2、capybara-webkit 0.14.0、TokenInput 1.6 を使用。

4

4 に答える 4

8

テスト環境に次の css を追加することをお勧めします。

  div, a, span, footer, header {
      -webkit-transition: none !important;
      -moz-transition: none !important;
      -ms-transition: none !important;
      -o-transition: none !important;
      transition: none !important;
  }

  .modal {
    display: none !important;
  }

  .modal.in {
    display: block !important;
  }

  .modal-backdrop {
    display: none !important;
  }

この js を本文の and に追加します。

$(".fade").removeClass("fade");

これで、カピバラとブートストラップに関する私の問題のほとんどが解決されました。

于 2014-03-11T10:00:33.117 に答える
1

Rails.env.___?ハッキング*を避けたい人のために、BootstrapベースのモーダルでjQuery UIのドラッグアンドドロップ機能をテストする際の問題を回避するために、次のことがうまくいくようです(これまでのところ-指が交差しました) 。

まず、次のようなヘルパー メソッドを使用して、モーダルが表示されるのを既に"待機"していました。

def wait_for_modal_to_appear
  modal = wait_until {
    # Look for the modal by ID/whatever...
  }
  raise Capybara::ModalNotFound.new('...') if modal.nil?
  return modal
end

それでも、そのモーダルで要素をドラッグ アンド ドロップしようとすると、誤った問題が発生しました。return行の直前に追加された次のコード追加は、トリックを行ったようです。

page.execute_script("document.getElementById('#{modal[:id]}').classList.remove('fade');")

if Rails.env.production?* ちょうどそのようなハッキングが最近、私が一緒に働いている会社での緊急展開の必要性につながりました... 悪いコード変更は、修飾子によってのみアクティブ化されたため、何とか本番環境に移行しました。そうでなければ、テストスイートの半分に失敗していたでしょう。

于 2016-08-19T19:02:48.527 に答える
1

これを行うだけで、うまくいくようです (たとえば、 をクリックします$('.tp-header-login'):

# instead of find(".tp-header-login")

find(".tp-header-login") # still do the find so you are sure its loaded then...
execute_script "$('.tp-header-login').click()"
于 2016-01-22T22:04:39.250 に答える