카피 바라는 요소의 속성을 주장


87

승인 테스트를 위해 RSpec2와 Capybara를 사용하고 있습니다.

Capybara에서 링크가 비활성화되어 있는지 여부를 확인하고 싶습니다. 어떻게 할 수 있습니까?

답변:


91

링크를 어떻게 비활성화합니까? 추가하는 수업입니까? 속성?

# Check for a link that has a "disabled" class:
page.should have_css("a.my_link.disabled")
page.should have_xpath("//a[@class='disabled']")

# Check for a link that has a "disabled" attribute:
page.should have_css("a.my_link[disabled]")
page.should have_xpath("//a[@class='disabled' and @disabled='disabled']")

# Check that the element is visible
find("a.my_link").should be_visible
find(:xpath, "//a[@class='disabled']").should be_visible

실제 xpath 선택기가 올바르지 않을 수 있습니다. xpath를 자주 사용하지 않습니다!


@idlefingers 감사합니다. xpath를 사용하여 주장하고 싶습니다. 어떻게 할 수 있습니까?
kriysna 2011 년

내 답변을 업데이트했습니다. xpath 선택기가 잘못된 경우 인터넷 검색을 수행하거나 새 질문을 열어야합니다.
idlefingers 2011 년

capybara는 뷰와 함께 작동하도록 만들어지지 않았기 때문에 뷰 테스트에는 작동하지 않습니다. (Webrat is.)
Peter Ehrlich

145

또 다른 간단한 해결책은 다음을 사용하여 찾고있는 HTML 속성에 액세스하는 것입니다 [].

find('#my_element')['class']
# => "highlighted clearfix some_other_css_class"

find('a#my_element')['href']
# => "http://example.com

# or in general, find any attribute, even if it does not exist
find('a#my_element')['no_such_attribute']
# => ""

참고 Capybara자동으로 끝까지 비동기 요청을 기다리는 것을 시도 할 것이다, 그러나 어떤 경우에는 작동하지 않을 수 있습니다 :

비동기 적으로 업데이트되는 요소에 대한 어설 션에 문제가있는 경우 한 가지 해결 방법은 다음과 같습니다.


4
Vrey 유용한 솔루션. 감사!
Alexander Kuznetsov

예를 들어 CSS 위치가있는 문자열이 있습니다. find('a#my_element[href]'),이 속성의 값을 검색 할 수 있습니까? 같은 표현을 시도 find('a#my_element[href]').value하지만 작동하지 않는 것 같습니다 :(
mickael dec

@mickael Try find('a#my_element[href]').text또는 find('a#my_element[href]').native. 둘 중 하나가 귀하가 기대하는 결과를 제공하는지 알려주십시오.
bowsersenior dec.

1
이 댓글이 정말 오래되었다는 것을 알고 있지만 다음과 같이 사용했습니다 : page.find ( '# my_element') [ 'href = "<href_value>"'] 그리고 그것은 대우를 받았습니다
Dono

비동기 변경에 대한 어설 션을 작성하려는 경우 쿼리가 참이 될 때까지 기다리지 않습니다.
sj26

4

올바른 xpath를 찾는 것은 약간 지저분했습니다. 여기에
capybara 0.4.1.1을 사용하여 올바른 xpath가 있습니다.

# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a>  

page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")

수업이없는 링크 만있는 경우

page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')

이와 같은 것은 슬프게도 작동하지 않습니다.

page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")

클래스 옵션은 무시됩니다.


4

have_linkfind_link(name)[:disabled]두 개의 별도 주장을 사용하는 것이 좋습니다 . 두 번째 어설 션 만 수행하는 것이 더 간단하지만 누락 된 링크에 대한 오류 메시지가 더보기 좋게 표시되어 테스트 결과를 더 쉽게 읽을 수 있습니다.

expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false

참고 "Example"링크의 이름이나 ID를 변경할 수 있습니다.


1
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})

have_link는 아무것도 제공하지 않으면 비어있는 옵션의 해시를 예상합니다. 링크에 있어야하는 속성을 지정할 수 있습니다. 모든 옵션을 하나의 해시로 전달했는지 확인하십시오.

도움이 되었기를 바랍니다

추신 : 데이터 메소드와 같은 속성의 경우 하이픈이 기호를 나누기 때문에 속성 이름을 문자열로 전달해야합니다.


6
그것은 결코 작동 하지 않았고 Capybara와 작동하지 않습니다. 9 명이 찬성 한 이유를 모르겠습니다.
Andrei Botalov 2013 년

카피 바라를 사용하여 카피 바라 2. 밥상에서이 더 이상 작품 <2 위 사용할 수 있습니다
티안

@Tian 그것은 Capybara <2에서 작동하지 않았습니다.이 답변에 반대 투표를 제안합니다.
안드레이 Botalov

class:유효하지 않습니다
Amir Raminfar 2014-10-17

1

가능하면 Capybara가 제공하는 래퍼를 사용하여 드라이버간에보다 일관되게 작동하도록해야합니다.

의 경우 disabled2.1에서 래퍼가 도입되었습니다. https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

이를 사용하면 RackTest와 Poltergeist 모두에서 합리적인 결과를 얻을 수 있습니다.

HTML :

<input type="text" id="disabled-false"            ></div>
<input type="text" id="disabled-true"     disabled></div>
<input type="text" id="disabled-js-true"          ></div>
<input type="text" id="disabled-js-false" disabled></div>
<script>
  document.getElementById('disabled-js-true').disabled = true
  document.getElementById('disabled-js-false').disabled = false
</script>

테스트 :

!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
 all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
 all(:field, 'disabled-js-false', disabled: false).empty? or raise

Capybara.current_driver = :poltergeist
!all(:field, 'disabled-false',    disabled: false).empty? or raise
 all(:field, 'disabled-false',    disabled: true ).empty? or raise
 all(:field, 'disabled-true',     disabled: false).empty? or raise
!all(:field, 'disabled-true',     disabled: true ).empty? or raise
!all(:field, 'disabled-js-true',  disabled: true ).empty? or raise
!all(:field, 'disabled-js-false', disabled: false).empty? or raise

CSS 선택기 대신 이것을 사용하면 Js 가능 드라이버를 사용하기 시작하면 Javascript 테스트가 변경없이 작동합니다.

여기에 실행 가능한 테스트 파일이 있습니다 .


0

bowsersenior , 힌트 주셔서 감사합니다

또 다른 간단한 해결책은 []로 찾고있는 HTML 속성에 액세스하는 것입니다.

다음은 그 예입니다.

let(:action_items) { page.find('div.action_items') }

it "action items displayed as buttons" do
  action_items.all(:css, 'a').each do |ai|
    expect(ai[:class]).to match(/btn/)
  end
end

0

Rspec3의 구문을 사용하여 다음과 같이했습니다.

expect(page).not_to have_selector(:link_or_button, 'Click here')

0

간단하게 page.has_css?방법 을 사용할 수 있습니다

page.has_css?('.class_name') 

true요소가 있으면 반환 됩니다.

유효성 검사에 따라 몇 가지 작업을 수행하십시오.

page.has_css?('.class_name') do
  #some code
end

0

문서 에 따르면 [attribute] 접근 자 구문을 사용할 수 있습니다.

find('#selector')['class'] => "form-control text optional disabled"

비활성화 된 경우 다음을 수행 할 수도 있습니다.

expect(find('#selector').disabled?).to be(true)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.