在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和所有组合
答案 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;)