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


125

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

<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

답변:


176

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

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의이 동작이 매우 좋다고 생각합니다.


4
#first를 사용하지 말 것을 권장합니다. rubydoc.info/github/jnicklas/capybara/… 요소가 존재할 때까지 기다리지 않습니다 . 컨텐츠가 JS에서 런타임에 작성된 경우 링크가 작성되기 전에 예상을 실행하면 먼저 nil을 리턴합니다.
22:33에


24

이 문구도 작동합니다.

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

고맙습니다. Capybara 2.4.1 및 안과 의사.
Mauricio Moraes

4

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)
  종료
종료

2

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

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

2

이러한 솔루션의 대부분은 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당신이하는 경기 새로운 요소를 도입하는 경우는 자동으로 다른 요소를 클릭하기 때문에, 더 취성이다.


이것이 가장 정확한 답변이라고 생각합니다.
katericata

-2

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

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

2
이 예는 카피 바라와 관련이 없습니다
keoghpe

2
그 jQuery 아닌가요?
emptywalls
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.