水豚断言元素的属性

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

我想断言链接是禁用或不在水豚。 我怎样才能做到这一点?

你如何禁用链接? 这是一个你添加的类吗? 一个属性?

# 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 

实际的xpathselect器可能不正确。 我不经常使用xpath!

另一个简单的解决scheme是通过[]访问您正在查找的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会自动尝试等待asynchronous请求完成,但在某些情况下可能不起作用:

如果您在asynchronous更新的元素上进行断言时遇到问题,可以使用以下解决方法:

找出正确的xpath有点麻烦,这里是正确的,
使用水豚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") 

如果你只有没有class级的链接,请使用

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

类选项将被忽略。

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

 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:对于像data-method这样的属性,由于连字符会破坏符号,所以必须将属性名称作为string传递。

只要有可能,你应该尝试使用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> 

testing:

 !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 

请注意,如果使用这个而不是CSSselect器,那么如果您开始使用支持Js的驱动程序,那么Javascripttesting将无需任何更改就能正常工作。

可运行的testing文件在这里 。

bowsersenior ,谢谢你的提示

另一个简单的解决scheme是使用[]来访问您正在查找的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 

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

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

只要你可以使用page.has_css? 方法

 page.has_css?('.class_name') 

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

根据validation做一些行动。

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