水豚断言元素的属性


87

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

我想断言该链接是否已在Capybara中禁用或未禁用。我怎样才能做到这一点?

Answers:


91

您如何禁用链接?您要添加的课程吗?属性?

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


感谢@idlefingers,我也想断言使用xpath。我该怎么办?
kriysna 2011年

我已经更新了答案。如果xpath选择器错误,则必须进行一些谷歌搜索或打开一个新问题。
idlefingers 2011年

请注意,这不适用于视图测试,因为水豚并未与视图一起使用。(Webrat是。)
Peter Ehrlich

145

另一个简单的解决方案是使用以下方法访问所需的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将自动尝试等待异步请求完成,但是在某些情况下可能不起作用:

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


4
非常有用的解决方案。谢谢!
亚历山大·库兹涅佐夫

我有一个带有CSS位置的字符串,例如。find('a#my_element[href]'),是否可以检索此属性的值?尝试使用类似find('a#my_element[href]').value但不起作用的表达式:(
mickael 2012年

@mickael尝试find('a#my_element[href]').textfind('a#my_element[href]').native。让我知道其中一个是否能提供您期望的结果。
bowsersenior 2012年

1
我意识到这些评论确实很旧,但是以这种方式使用:page.find('#my_element')['href =“ <href_value>”'']并有效地解决了问题
Dono

如果要对异步更改进行断言,这将不等待查询变为真。
sj26 2015年

4


使用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选项将被忽略。


4

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

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

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


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

have_link期望选项的哈希值,如果您不提供任何值,则为空。您可以指定链接应具有的任何属性-只需确保在ONE哈希中传递所有选项即可。

希望这可以帮助

PS:对于诸如数据方法之类的属性,您必须将属性名称作为字符串传递,因为连字符会破坏符号。


6
它从来没有用过,也不能与水豚一起使用。我不知道为什么有9个人对此表示反对。
Andrei Botalov 2013年

这在Capybara 2中不再起作用。使用Capybara <2的人可以使用上面的方法
Tian

@Tian在Capybara <2中不起作用。我建议您对此答案不满意。
Andrei Botalov

class:无效
Amir Raminfar 2014年

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

请注意,如果您开始使用支持Js的驱动程序,那么使用此方法而不是CSS选择器将如何在不进行任何更改的情况下运行JavaScript测试。

可运行的测试文件在这里


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


0

只需使用page.has_css?方法

page.has_css?('.class_name') 

true如果element存在,它将返回。

根据验证执行一些操作。

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

0

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

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

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

expect(find('#selector').disabled?).to be(true)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.