3

簡単にするために、テストのほとんどを省略し、問題のあるコードのみを含めました。それは:

click_button('Search')  
page.select 'Preferred', :from => 'ticket_service_type'  

これを実行すると、次のメッセージが表示されます。

Failure/Error: page.select 'Preferred', :from => 'ticket_service_type'
Capybara::ElementNotFound:
  cannot select option, no select box with id, name, or label 'ticket_service_type' found`

このボタン クリック イベントがトリガーする AJAX 要求は select タグとは関係がないため、テストで順序を逆にすると、テストはパスします。Capybara のデフォルトの待機時間は 2 秒であることを知っているので、次のように 10 に変更しました。

Capybara.default_wait_time = 10

これにより、テストがパスすることはありません。これら 2 つのメソッドを互いにうまく連携させ、ユーザーが Web ページを操作する順序で機能させるにはどうすればよいでしょうか?

(自分の仕様からコードを投稿していれば、これはすぐに解決されたに違いありません。)

4

2 に答える 2

1

:js => trueJavaScript に依存する統合テストに必ず追加してください。

于 2013-12-30T21:43:06.937 に答える
1

The Cucumber Bookから(強調鉱山):

幸いなことに、カピバラはこの状況に簡単に対処する方法を知っています。まだ存在していないページ上の DOM 要素の CSS セレクターを渡す明示的な find 呼び出しを追加すると、Capybara は少し (50ms) 待機し、要素が表示されるまで再試行します。しばらくしても表示されない場合 (デフォルトでは 2 秒ですが、これは構成可能です)、例外が発生し、ステップ定義が失敗します。

したがって、AJAX で DOM に何かを書き込み、それをステップ定義で find() します。それは理想的ではありません。私の場合、テストを容易にするために (隠し) DOM 要素を導入していますが、別の方法は見つかりませんでした。

于 2012-01-09T22:18:42.540 に答える