[ruby-on-rails] Capybara에서 부모 노드를 얻는 방법은 무엇입니까?

나는 종종 id 또는 기타 식별 속성없이 DOM 요소를 생성하는 많은 jQuery 플러그인을 사용하고 있으며,이를 Capybara에서 가져 오는 유일한 방법 (예 : 클릭)-먼저 이웃 (조상의 다른 자식)을 가져 오는 것입니다. . 그러나 나는 어디에도 찾지 못했습니다. 예를 들어 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, '..')

이를 지원하기 위해 카피 바라가 업데이트되었습니다.

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


답변

부모 ( 조상 에서와 같이) 노드 를 찾는 방법을 알아 내려고 우연히 발견 한 경우 ( @Pascal Lindelauf의 답변에 대한 @ vrish88의 의견에서 힌트) :

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


답변

이 답변은 원래 질문이 암시한다고 생각하는 형제 요소를 조작하는 방법과 관련이 있습니다.

귀하의 질문 가설은 약간의 조정으로 작동합니다. 동적으로 생성 된 필드가 다음과 같고 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 클래스가있는 조상을 찾아야했지만 대상 조상에 하나 이상의 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

경고 : 이것을 아껴서 사용하면 테스트에서 많은 시간이 소요될 수 있으므로 조상이 몇 홉 떨어져 있는지 확인하십시오.