capybara를 사용하여 양식 필드가 올바르게 미리 채워져 있는지 어떻게 확인할 수 있습니까?


145

카피 바라로 채울 수있는 적절한 레이블이있는 필드가 있습니다.

fill_in 'Your name', with: 'John'

채우기 전에 값을 확인하고 파악할 수 없습니다.

fill_in다음 줄 뒤에 추가하면 :

find_field('Your name').should have_content('John')

페이지를 저장하여 확인한대로 바로 채우기가 작동했지만 테스트는 실패합니다.

내가 무엇을 놓치고 있습니까?

답변:


179

xpath 쿼리 를 사용하여 input특정 값을 가진 요소 (예 : 'John') 가 있는지 확인할 수 있습니다 .

expect(page).to have_xpath("//input[@value='John']")

자세한 내용은 http://www.w3schools.com/xpath/xpath_syntax.asp 를 참조 하십시오 .

아마도 더 예쁘게 :

expect(find_field('Your name').value).to eq 'John'

편집 : 요즘 아마도 have_selector를 사용합니다.

expect(page).to have_selector("input[value='John']")

페이지 객체 패턴을 사용하는 경우 (해야합니다!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"

아, 나는 .value조금 을 놓치고 있었다 . 감사!
Marc-André Lafortune

나는 같은 문제가 있었지만 양식 필드가 아닌 div에 있습니다. 같은 문제가있는 다른 사람은 find_field (). value 대신 find_by_id (). text를 사용하십시오. 그 가치가 양식 분야에서만 효과가 있다는 것을 발견하기까지 오랜 시간 이 걸렸습니다 …
John Y

8
후자의 문제점은 Capybara의 폴링주기를 사용하지 않기 때문에 더 오래 실행되는 JS 코드로 필드를 설정하면 즉시 실패합니다. 정적으로 생성 된 양식으로 시도하지 않는 한 첫 번째 방법이 선호됩니다.
fqxp

1
@fqxp에는 RSpec Matchers와 새로운 기대 구문을 사용하는 더 나은 대답이 있다고 생각합니다. 내가 문서에서 볼 수있는 것에서, find_field그리고 다른 Node::Finders것들은 노드를 찾고 기대하지 않고 노드에서 조치를 수행하는 데 사용됩니다. 물론 이것은 규칙이 아니지만 내장 된 솔루션을 사용하는 것이 더 좋은 아이디어이므로 간단한 것입니다. 그냥 말해!
에이전트 47DarkSoul

사실, 지금은 선호되는 방법이 될 것이지만,이 질문 후 약 한 달 후에 구문이 발표되었습니다.
DVG

309

또 다른 예쁜 해결책은 다음과 같습니다.

page.should have_field('Your name', with: 'John')

또는

expect(page).to have_field('Your name', with: 'John')

각기.

또한 참조 참조 .

참고 : 비활성화 된 입력의 경우 옵션을 추가해야합니다 disabled: true.


23
선택한 답변보다 훨씬 낫습니다!
에이전트 47DarkSoul

3
오류 메시지에 예상 문자열과 실제 문자열이 표시되므로 선택한 답변을 선호합니다. 이로 인해 도움이되지 않는 "예상 필드"my field "가 무언가를 반환합니다"오류가 발생합니다. 그러나 이것은 확실히 더 잘 읽고 페이지 매처 API를 더 잘 따릅니다. 모든 주위에 찬성!
mraaroncruz

1
내가 알 수있는 한, 이것은 실제로 필드의 값을 확인하는 것이 아니라 값에 관계없이 필드의 존재를 확인합니다. 문서에서 값을 기준으로 필터링해야한다고 말했기 때문에 버그라고 생각합니다.
Nick

1
전달 with하면 값이 일치하는 경우에만 true를 반환했는데, 이는 예상 결과입니다.
벤 Saufley

4
대답이 처음 작성된 후 오류 메시지가 개선되었을 수 있지만 이제는 expected […] but there were no matches. Also found "", which matched the selector but not all filters..빈 필드에 도착 하여 매우 멋진 오류 메시지에 매우 가깝습니다.
Patru

2

자리 표시자를 테스트하려는 경우 다음을 사용하십시오.

page.should have_field("some_field_name", placeholder: "Some Placeholder")

또는:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

사용자가 입력 한 값을 테스트하려는 경우 :

page.should have_field("some_field_name", with: "Some Entered Value")

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