capybara断言元素的属性

时间:2011-03-01 11:00:26

标签: ruby-on-rails rspec capybara

我正在使用RSpec2和Capybara进行验收测试。

我想断言链接在Capybara中是否被禁用。我怎么能这样做?

10 个答案:

答案 0 :(得分:142)

另一个简单的解决方案是使用[]访问您要查找的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会自动尝试等待异步请求完成,但在某些情况下可能无效:

如果您对异步更新的元素的断言有问题,这是一个解决方法:

答案 1 :(得分:90)

你是如何禁用链接的?这是你要加的课吗?属性?

# 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!

答案 2 :(得分:4)

找出正确的xpath有点麻烦,这是正确的一个,
使用capybara 0.4.1.1

# <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")

将忽略class选项。

答案 3 :(得分:4)

我建议在两个单独的断言中使用have_linkfind_link(name)[:disabled]。虽然单独执行第二个断言更简单,但这使得关于缺失链接的错误消息看起来更好,使您的测试结果更容易阅读。

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

请注意,"Example"可以更改为链接的名称或ID。

答案 4 :(得分:1)

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

has_link需要一个选项哈希值,如果你不提供任何选项,则为空。您可以指定链接应具有的任何属性 - 只需确保传递一个哈希中的所有选项。

希望这有帮助

PS:对于像data-method这样的属性,你必须将属性名称作为字符串传递,因为连字符会破坏符号。

答案 5 :(得分:1)

只要有可能,您应该尝试使用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测试将无需任何更改。

可运行的测试文件here

答案 6 :(得分: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

答案 7 :(得分:0)

使用Rspec3的语法我这样做了:

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

答案 8 :(得分:0)

只需使用page.has_css?方法

即可
page.has_css?('.class_name') 

如果元素存在,这将返回true

根据验证做一些操作。

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

答案 9 :(得分:0)

根据the docs,您可以使用[attribute]访问器语法:

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

对于残疾人士,您也可以这样做:

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