[ruby] Capybara 2.0으로 업그레이드 한 후 항목 목록에서 첫 번째 링크를 클릭하는 방법은 무엇입니까?

이 경우 첫 번째 링크를 클릭하는 방법 :

<div class="item">
  <a href="/agree/">Agree</a>
</div>
<div class="item">
  <a href="/agree/">Agree</a>
</div>
within ".item" do
  first(:link, "Agree").click
end

이 오류가 발생합니다.

Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching css ".item"

그리고 within내가 없으면 이 오류가 발생합니다.

Failure/Error: first(:link, "Agree").click
NoMethodError:
  undefined method `click' for nil:NilClass



답변

당신은 단지 사용할 수 있습니다 :

first('.item').click_link('Agree')

또는

first('.item > a').click

(기본 선택기가 : css 인 경우)


질문의 코드는 다음과 같이 작동하지 않습니다.

within ".item" do
  first(:link, "Agree").click
end

다음과 같습니다.

find('.item').first(:link, "Agree").click

Capybara는 몇 가지를 발견 .item하여 예외를 발생시킵니다. Capybara 2의이 동작이 매우 좋다고 생각합니다.


답변

다음을 시도하십시오 :

within ".item" do
  click_link("Agree", :match => :first)
end

출처 :


답변

이 문구도 작동합니다.

within first(".item") do
  click_link "Agree"
end


답변

Xpath는 요소를 처리 할 수 ​​있습니다. 아직 잘 못하지만//div[@class='active'][1]/a

그것은 작동하거나 작동하지 않을 수 있지만 요점은 xpath가 일치하는 배열을 처리하고 특정 배열을 가져올 수 있다는 것입니다. 이것과 일치 할 수 있어야합니다.

내 프로젝트 중 하나의 실제 예 :

page.find ( "div.panel", text : / Proposals /) 내에
  page.find ( 'tr', text : / Foo /) 내에
    page.sh_ have_xpath ( 'td [3]', 텍스트 : @today)
  종료
종료


답변

first ()가 항상 기다리는 것은 아니기 때문에 아마도 이것이 유용 할 것입니다 :

expect(page).to have_css("selector")
first("selector").click


답변

이러한 솔루션의 대부분은 Capybara의 화려한 대기 기능을 사용하지 않습니다

이 링크가 제안하는 것처럼 더 잘 하십시오 :
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

나쁜:

first(".active").click
페이지에 .active 요소가 없으면 먼저 nil을 반환하고 클릭이 실패합니다.

좋은:

정확히 하나 있는지 확인하려면
find(".active").click

첫 번째 요소를 원한다면
find(".active", match: :first).click
Capybara는 요소를 클릭하기 전에 요소가 나타날 때까지 기다립니다.

match: :first당신이하는 경기 새로운 요소를 도입하는 경우는 자동으로 다른 요소를 클릭하기 때문에, 더 취성이다.


답변

간단하게 사용할 수 있습니다.

$('.item').find('a').first().click();