私は多くのjQueryプラグインを使用しています。これらのプラグインは、IDやその他の識別プロパティなしでDOM要素を作成することが多く、Capybaraでそれらを取得する唯一の方法(クリックなど)は、最初にネイバー(その祖先の別の子)を取得することです。 。しかし、私はどこにも見つかりませんでした。たとえば、カピバラはそのようなものをサポートしていますか。
find('#some_button').parent.fill_in "Name:", :with => name
?
私は多くのjQueryプラグインを使用しています。これらのプラグインは、IDやその他の識別プロパティなしでDOM要素を作成することが多く、Capybaraでそれらを取得する唯一の方法(クリックなど)は、最初にネイバー(その祖先の別の子)を取得することです。 。しかし、私はどこにも見つかりませんでした。たとえば、カピバラはそのようなものをサポートしていますか。
find('#some_button').parent.fill_in "Name:", :with => name
?
回答:
jamuraaの答えは本当に役に立ちましたが、私の場合、完全なxpathを使用すると文字列の悪夢が発生したため、Capybaraでfindを連結する機能を利用して、cssとxpathの選択を組み合わせることができました。この場合、例は次のようになります。
find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
Capybara 2.0アップデート:エラーが発生find(:xpath,".//..")
する可能性がありAmbiguous match
ます。その場合は、first(:xpath,".//..")
代わりに使用してください。
.//..
親を見つける必要はありません-ただ..
十分であり、それも曖昧になることはありません。
カピバラとCSSでこれを行う方法はありません。私は過去にこの目標を達成するためにXPathを使用しましたが、これには親要素を取得する方法があり、Capybaraによってサポートされています。
find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
find(:xpath, '//*[@id="some_button"]/..')
私はそれが機能する次のものを見つけました:
find(:xpath, '..')
Capybaraは、これをサポートするように更新されました。
この答えは、元の質問がほのめかしていると私が信じている兄弟要素を操作する方法に関係しています
あなたの質問の仮説は、微調整で機能します。動的に生成されたフィールドが次のようになり、IDがない場合:
<div>
<input></input>
<button>Test</button>
</div>
その場合、クエリは次のようになります。
find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever')
動的に生成された入力にid要素が添付されている場合(角度の場合と同様にこれらに注意してください。要素の追加と削除に基づいて変更されることはありません)、次のようになります。
find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')
お役に立てば幸いです。
この親要素内のテキストを使用して最初に親要素を見つけることにより、別のアプローチを使用しています。
find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name
たぶん、これは同様の状況で役立ちます。
cssクラスを持つ祖先を見つける必要がありましたが、ターゲットの祖先に1つ以上のcssクラスが存在するかどうかは不明であったため、決定論的なxpathクエリを作成する方法がわかりませんでした。私は代わりにこれを作り上げました:
def find_ancestor_with_class(field, cssClass)
ancestor = field
loop do
ancestor = ancestor.find(:xpath, '..')
break if ancestor.nil?
break if ancestor.has_css? cssClass
end
ancestor
end
警告:これは慎重に使用してください。テストに多くの時間がかかる可能性があるため、祖先がほんの数ホップ離れていることを確認してください。
break if ancestor[:class].split(" ").include?(css_class)
。に置き換えます。
ancestor(selector)
に建てられた方法を参照してください。github.com/teamcapybara/capybara/commit/...