13

Rails 統合テストが失敗しましたが、その理由がわかりません。SeleniumをドライバーとしてCapybaraを使用しています。

このテストでは、AJAX 呼び出しが行われた後にページ コンテンツが削除されたことを確認します。関連するアクションは、ボタンがクリックされることであり、そのボタンのクリックにより、jQueryremove()呼び出しを介してページのセクションが削除されます。以下は、統合テスト コードの概算です。

click_button("Remove stuff")
assert has_no_link?("This should be removed")

アサーションは失敗し、リンクがまだ存在することを意味します。

私は Capybara について調べていて、デフォルトの待機時間を延長できることを知っています。私はそれをばかげた値 (20 秒) に拡張しましたが、それでもアサーションは失敗します。

自分で手動でテスト プロセスを実行すると、ページのソースにはコンテンツが表示されますが、DOMには表示されません (Firefox の DOM インスペクターを表示して要素を探します)。これは問題ですか?テストが Firefox で実行されている間に DOM検査して、コンテンツが存在するかどうかを確認しようとしましたが、存在しないようです。

DOM に存在しなくなったこのリンクをカピバラがまだどのように見つけているのか、私にはわかりません。Capybara は DOM ではなくソースを調べて、そこにリンクを見つけていますか? もしそうなら、私はこのテストを修正してテストに合格することを確認する方法がわかりません。ページを更新すると問題は解決しますが、それはユーザーが行うことではないため、テストに合格するためだけにページを変更することをためらっています...

この問題にアプローチする方法についての推奨事項があれば幸いです。

ありがとう!

4

7 に答える 7

1

wait_until というメソッドがいくつかありましたが、最近非推奨になり、synchronize メソッドに変更されました。

http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara

https://github.com/jnicklas/capybara/blob/master/lib/capybara/node/base.rb#L44

今のところ、正確な使い方はわかりませんが、作者からの質問への回答を待っているので、この問題がすぐに解決されることを願っています

于 2013-01-30T15:17:37.350 に答える
0

最初にリンクで何か他のものをテストしてから、それが削除されたことをテストしていますか?

言い換えれば、あなたのテストは次のようなものですか:

has_no_link = $('#id_for_link')
//.... some test
click_button("Remove stuff")
assert has_no_link?("This should be removed")

その場合、has_no_link は引き続きリンクを指します。remove() はそれを DOM から削除しますが、変数はまだメモリ内でそれを指しています。

結果が得られるかどうかを確認するには、DOM でリンクをもう一度クエリする必要があります。

于 2013-12-14T16:41:39.760 に答える
0

YouTube ビデオを特定の時点までストリーミングすることによってトリガーされるコールバックを待機することを含むテストのために、wait_until を書き直す必要がありました。これが私が使用したものです:

# in spec_helper.rb
require "timeout"
def wait_until time=0.1
    Timeout.timeout(Capybara.default_wait_time) do
        sleep(time) until value = yield
        value
    end
end
于 2013-12-26T22:49:16.783 に答える
0

私が考えたいくつかのアプローチ:

1: カピバラのバージョンを確認し、バージョンのバグを探します

2: ボタンがクリックされた後、リンクを検索してみてください。

click_button("Remove stuff") find(:xpath, '//a[text()='リンクを削除する必要があります').should be_false

3: has_link を使用しますか? has_no_link の代わりに?

click_button("削除する") page.has_link?("リンクを削除する必要があります").should be_false

于 2014-01-10T18:07:44.117 に答える
0

ajax リクエストが完了したことを確認するための優れた方法があります。これは、この記事で学んだことです。特定の時間の代わりにwait、ajax$.active関数を使用できます (実際の API にはありませんが、使用できるように公開されています)。$.activeサーバーへのアクティブな接続の数を教えてくれるので、それがゼロになると、ajax リクエストが完了したことがわかります。

wait_until do
  page.evaluate_script('$.active') == 0
end

それがうまくいかない場合、問題は別の場所にあります (あなたが書いたものから判断すると、そう思われます)。変更が DOM でのみ発生している場合は、テスト/仕様で JavaScript が有効になっていることを確認する必要があります。たとえば、rspec では、そのように設定:js => trueします。Cucumber では、シナリオの上に で行を追加します@javascript。Rails のデフォルト テストは使用しませんが、同じように設定する必要があります。

于 2012-09-23T22:16:11.600 に答える