승인 테스트를 위해 RSpec2와 Capybara를 사용하고 있습니다.
Capybara에서 링크가 비활성화되어 있는지 여부를 확인하고 싶습니다. 어떻게 할 수 있습니까?
답변
링크를 어떻게 비활성화합니까? 추가하는 수업입니까? 속성?
# 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를 자주 사용하지 않습니다!
답변
또 다른 간단한 해결책은 다음을 사용하여 찾고있는 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
자동으로 끝까지 비동기 요청을 기다리는 것을 시도 할 것이다, 그러나 어떤 경우에는 작동하지 않을 수 있습니다 :
비동기 적으로 업데이트되는 요소에 대한 어설 션에 문제가있는 경우 한 가지 해결 방법은 다음과 같습니다.
답변
올바른 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")
클래스 옵션은 무시됩니다.
답변
have_link
및 find_link(name)[:disabled]
두 개의 별도 주장을 사용하는 것이 좋습니다 . 두 번째 어설 션 만 수행하는 것이 더 간단하지만 누락 된 링크에 대한 오류 메시지가 더보기 좋게 표시되어 테스트 결과를 더 쉽게 읽을 수 있습니다.
expect(page).to have_link "Example"
expect(find_link("Example")[:disabled]).to be false
참고 "Example"
링크의 이름이나 ID를 변경할 수 있습니다.
답변
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_link는 아무것도 제공하지 않으면 비어있는 옵션의 해시를 예상합니다. 링크에 있어야하는 속성을 지정할 수 있습니다. 모든 옵션을 하나의 해시로 전달했는지 확인하십시오.
도움이 되었기를 바랍니다
추신 : 데이터 메소드와 같은 속성의 경우 하이픈이 기호를 나누기 때문에 속성 이름을 문자열로 전달해야합니다.
답변
가능하면 Capybara가 제공하는 래퍼를 사용하여 드라이버간에보다 일관되게 작동하도록해야합니다.
의 경우 disabled
2.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 테스트가 변경없이 작동합니다.
답변
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