我正在使用RSpec2和Capybara进行验收测试。
我想断言链接在Capybara中是否被禁用。我怎么能这样做?
答案 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_link
和find_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)