[ruby-on-rails] 카피 바라는 요소의 속성을 주장

승인 테스트를 위해 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_linkfind_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가 제공하는 래퍼를 사용하여 드라이버간에보다 일관되게 작동하도록해야합니다.

의 경우 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 테스트가 변경없이 작동합니다.

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


답변

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