与Capybara has_css匹配器的Rspec无法正常工作

时间:2015-06-08 05:31:50

标签: ruby-on-rails rspec cucumber capybara

在Cucumber中,有了Rspec和Capybara,我有一个测试来检查按钮是否有类。这是

expect(@some_button).to have_css(".in-cart")

失败了,但是

@some_button['class']

返回

'btn product in-cart'

因此按钮肯定有“购物车”类。

作为一项临时措施,我已将测试改为: -

expect(@some_button['class']).to match /in-cart/

这显然是疯了。但为什么要'have_css'或'has_css?'对于明显具有预期类的DOM元素,返回false?

page.all('。in-cart')也包含按钮,因此Capybara绝对可以找到它。

顺便说一下,我也尝试过'button.in-cart','in-cart',期待(等).to have_selector,expect(etc.has_selector?('。in-cart'))。to be_truthy和所有组合

3 个答案:

答案 0 :(得分:8)

have_css匹配器应该应用于父容器而不是实际元素

# your view
<div id="container">
  <div class="in_cart product"></div>
</div>

# your step definition
parent = page.find('div#container')
expect(parent).to have_css(".in-cart")
# => returns true, as there is nested div.in_cart
expect('div#container div').to have_css(".in-cart")
# => returns false, as there is no such selector inside of the latter div

在匹配确切对象的属性时,您必须坚持按键进行简单的查询

element = page.find('div#container div')
element['class'].should include('in-cart')
expect(element['class']).to match /in-cart/

同样的逻辑适用于所有RSpecMatchers

答案 1 :(得分:3)

在较新版本的Capybara / Rspec中,默认情况下,expect(page)会查询整个页面以查找匹配项;但是,有时我们可能不希望这样,而是更愿意定位页面的特定类/区域。对于这些情况,请使用page缩小within的上下文:

within('.container') do
  expect(page).to have_css(".in-cart")
end

假设父母有一个班级container,Capybara只会在这个元素内搜索。

答案 2 :(得分:-1)

期待(页面).to have_css(&#39; button.in-cart&#39;)