이 경우 첫 번째 링크를 클릭하는 방법 :
<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();