programing

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

nasanasas 2020. 9. 15. 07:54
반응형

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


저는 승인 테스트를 위해 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="/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는 아무것도 제공하지 않으면 비어있는 옵션의 해시를 예상합니다. 링크에 있어야하는 모든 속성을 지정할 수 있습니다. 모든 옵션을 하나의 해시로 전달했는지 확인하십시오.

도움이 되었기를 바랍니다

PS: For attributes like data-method you have to pass the attribute name as a string since the hyphen breaks the symbol.


Whenever possible, you should try to use the Capybara provided wrappers which will work more consistently across drivers.

For the particular case of disabled, a wrapper was introduced in 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210

If you use it, you will get sensible results on both RackTest and 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>

Tests:

!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

Note how by using this instead of CSS selectors, the Javascript tests will work without any changes if you start using a Js capable driver.

Runnable test file here.


bowsersenior, thanks for a hint

Another simple solution is to access the HTML attribute you are looking for with []

Here is an example:

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

Using Rspec3's syntax i did it this way:

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

Simply you can use page.has_css? method

page.has_css?('.class_name') 

this will return true if element exists.

Do some action based on validation.

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

According to the docs you can use the [attribute] accessor syntax:

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

For disabled, you could also do this:

expect(find('#selector').disabled?).to be(true)

참고URL : https://stackoverflow.com/questions/5153550/capybara-assert-attributes-of-an-element

반응형