0

Ruby、Rails、および TDD の初心者。Capybara と Capybara Webkit で RSpec を使用しています。

ページに div 要素が存在するかどうかをテストしようとしています。

テストコード:

require 'spec_helper'
describe "Login module" do

    before do 
        visit root_path
    end

    it "should have a module container with id mLogin" do
        page.should have_css('div#mLogin')
    end

    it "should have a module container with id mLogin", :js => true do
        page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin"
    end

end

最初のテストはパスしますが、2 番目のテストは次のように失敗します。

Login module should have a module container with id mLogin
     Failure/Error: page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin"

       expected: "mLogin"
            got: nil

ブラウザー開発ツールで JS を実行し、nil ではなく "mLogin" を取得します。

何か案は?ありがとう。

4

2 に答える 2

0

考えられる問題の 1 つは、have_cssマッチャーが Capybara の同期機能をサポートしていることです。セレクターがすぐに見つからない場合は、見つかるかタイムアウトになるまで待機して再試行します。

これに関する詳細なドキュメントがhttp://rubydoc.info/github/jnicklas/capybara#Asynchronous_JavaScript__Ajax_and_friends_にあります

一方、evaluate_scriptすぐに実行されます。これはページにアクセスした後に最初に行うことであるため、競合状態があります。ページの読み込みが完了する前にこのスクリプトが実行される可能性があります。

を呼び出す前に、ページが読み込まれるまで表示されないページ上の要素を見つけようとすることで、これを修正できますevaluate_script

別の方法として、呼び出しを への呼び出しでラップしsynchronizeて明示的に再試行することもできますが、これは一般的にはお勧めできません。このような状況では、Capybara の組み込みマッチャーを使用する方がはるかに優れています。このevaluate_scriptメソッドは、実行する必要があることを実行するための組み込みの方法がなく、競合状態を回避するために細心の注意を払う必要がある場合にのみ、最後の手段として使用する必要があります。

于 2013-04-29T11:05:12.677 に答える
0
find('div#mLogin')[:id].should eq 'mLogin'

ドキュメントからこれを参照してください:

#evaluate_script
Evaluate the given JavaScript and return the result. Be careful when using this with scripts that return complex objects, such as jQuery statements. execute_script might be a better alternative.

私が覚えている限り、evaluate_script は常に nil を返します。

とにかく、最初のテストで十分なので、2番目のテストはカピバラが機能するかどうかをテストしているようです。

于 2013-04-27T10:46:42.617 に答える