2017-05-25 6 views
1

Capybaraでは、いくつかの同一の親ノードを共有するノードでいくつかのコマンドを実行しますが、いくつかのケースではまったく異なるノードを参照する必要があります。これは次のように書くことができます。'within'ブロック内から外部ノードを参照する

find('.the .same #part').find('#different_part1').set... 
find('.the .same #part').find('.different_part2').set... 
find('#a_completely_different_path').set... 
find('.the .same #part').find('#different_part3').set... 
find('.the .same #part').find('.different_part4').set... 

私はそれらを一緒に入れてwithinメソッドを使用したいが、完全に別のパスを持っているノードに対して、私はwithinブロックの外のコンテキストを参照する必要があります。私はそれを行う方法を確認していない:

within('.the .same #part') do 
    find('#different_part1').set... 
    find('.different_part2').set... 
    # find('#a_completely_different_path').set... 
    find('#different_part3').set... 
    find('.different_part4').set... 
end 

どのように私は一時的にwithinの影響から逃れるとを参照することができますか? withinのソースを見てみると

答えて

4

def within(*args) 
    new_scope = if args.first.is_a?(Capybara::Node::Base) then args.first else find(*args) end 
    begin 
    scopes.push(new_scope) 
    yield 
    ensure 
    scopes.pop 
    end 
end 

おそらく、例えば機能を反転Session、にメソッドを追加することができるはずです。

次の操作を実行できるようにする必要があり
def without 
    current_scope = scopes.pop 
    yield 
ensure 
    scopes.push(current_scope) 
end 

within('.the .same #part') do 
    find('#different_part1').set... 
    find('.different_part2').set... 
    without { find('#a_completely_different_path').set... } 
    find('#different_part3').set... 
    find('.different_part4').set... 
end 
+0

グレート。ありがとう。 。 – sawa

+1

あなたの答えは、私の見て正しい場所に私を指示し、大きな助けでしたが、私は簡単な解決策を考え出した。申し訳ありませんが、私は受け入れられた回答を私のところに移します。 – sawa

1

私はそれを行う方法を発見しました。 page.documentを使用してください。

within('.the .same #part') do 
    find('#different_part1').set... 
    find('.different_part2').set... 
    page.document.find('#a_completely_different_path').set... 
    find('#different_part3').set... 
    find('.different_part4').set... 
end 
+0

hm 'page.find(..)' - うまくいきませんでしたか? –

+0

なぜ機能するのですか? – sawa

関連する問題