web-dev-qa-db-ja.com

カピバラで親ノードを取得する方法は?

私は多くのjQueryプラグインで作業していますが、多くの場合、idまたは他の識別プロパティなしでDOM要素を作成し、カピバラでそれらを取得する唯一の方法(クリックなど)-最初に隣人(その祖先の別の子)を取得することです。しかし、私はどこにも見つかりませんでした、カピバラはそのようなことをサポートしていますか?

find('#some_button').parent.fill_in "Name:", :with => name

80
sandrew

私は本当にjamuraaの答えが役に立ったと感じましたが、完全なxpathに行くと私の場合は文字列の悪夢をもたらしたので、カピバラのfindを連結する機能を喜んで利用し、cssとxpath選択を混在させることができました。その場合、例は次のようになります。

_find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
_

Capybara 2.0 updatefind(:xpath,".//..")は、おそらく_Ambiguous match_エラーになります。その場合は、代わりにfirst(:xpath,".//..")を使用してください。

106

CapybaraとCSSでこれを行う方法はありません。過去にXPathを使用してこの目標を達成しましたが、これには親要素を取得する方法があり、Capybaraによってサポートされています。

find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
38
jamuraa

動作する次のものが見つかりました。

find(:xpath, '..')

これをサポートするためにカピバラが更新されました。

https://github.com/jnicklas/capybara/pull/505

29
B Seven

祖先のように)親ノードを見つける方法を見つけようとしてこれに遭遇した場合(@Pascal Lindelaufの答えに関する@ vrish88のコメントで示唆されているように):

find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')
9
Ben Alavi

この回答は、元の質問が示唆していると思われる兄弟要素の操作方法に関するものです

あなたの質問仮説は、マイナーな調整で機能します。動的に生成されたフィールドが次のようになり、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')

お役に立てば幸いです。

4
T. Slater

私はこの親要素内のテキストを使用して最初に親要素を見つけることにより、別のアプローチを使用しています:

find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name

たぶんこれは似たような状況で役立つでしょう。

4
Harm de Wit

ターゲットの祖先に1つ以上のcssクラスが存在するかどうかは不確定でしたが、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

警告:これを控えめに使用すると、テストに多くの時間がかかる可能性があるため、先祖がほんの数ホップ離れていることを確認してください。

2
kross