我正在使用RSpec2和Capybara进行验收测试。
我想断言该链接是否已在Capybara中禁用或未禁用。我怎样才能做到这一点?
Answers:
您如何禁用链接?您要添加的课程吗?属性?
# 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
将自动尝试等待异步请求完成,但是在某些情况下可能不起作用:
如果您对异步更新的元素的断言有问题,这是一种解决方法:
find('a#my_element[href]')
,是否可以检索此属性的值?尝试使用类似find('a#my_element[href]').value
但不起作用的表达式:(
find('a#my_element[href]').text
或find('a#my_element[href]').native
。让我知道其中一个是否能提供您期望的结果。
使用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")
class选项将被忽略。
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_link期望选项的哈希值,如果您不提供任何值,则为空。您可以指定链接应具有的任何属性-只需确保在ONE哈希中传递所有选项即可。
希望这可以帮助
PS:对于诸如数据方法之类的属性,您必须将属性名称作为字符串传递,因为连字符会破坏符号。
class:
无效
只要有可能,您都应该尝试使用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
请注意,如果您开始使用支持Js的驱动程序,那么使用此方法而不是CSS选择器将如何在不进行任何更改的情况下运行JavaScript测试。
可运行的测试文件在这里。
使用Rspec3的语法,我这样做是这样的:
expect(page).not_to have_selector(:link_or_button, 'Click here')