Capybara没有按照我期望的方式HaveSelector
使用 RSpec 。expect
我是 Capybara 和 RSpec 的新手,所以这很可能是我对 RSpec 或 Capybara 的误解,或者它可能是 Capybara(2.0.2 版)的缺陷。请帮助我理解我的错误或制作错误报告/功能请求。
在我的 RSpec 中,我写道:
expect { click('.special-div .submit') }.to have_css('.submitted')
我希望这在功能上等同于
click('.special-div .submit')
page.should have_css('.submitted')
但事实并非如此。相反,匹配器have_css
尝试匹配 proc 对象的字符串转换,而不是调用 proc 对象的结果。(换句话说,click('.special-div .submit')
永远不会被执行。)
是水豚的行为:
- 很合理
- Capybara 中缺失功能的示例
- Capybara 2.0.2 中的一个错误
- 还有什么?
另外,我显然可以通过使用上面的 2 行版本来做我想做的事,但是我们的团队正在尝试标准化expect {}
,那么有没有办法使用expect {}
表格并让它做我想做的事?
编辑
我继承了我正在使用的代码,所以我没有意识到,正如 Andrey Botalov 指出的那样,click
它不是 Capybara 的标准部分。看起来应该是这样,但又click
已经被大量用于其他事情,所以 Capybara 最好不要添加另一个定义。
由于有些人似乎持怀疑态度,因此我向您保证,这段代码运行良好:
click('.special-div .submit')
page.should have_css('.submitted')
对于那些想知道的人来说have_css()
,这就是 RSpec 的魔力has_css?
。对于那些想知道的click
人,在我的项目中,有人方便地创建了click
如下功能:
def click(css)
page.execute_script("$('#{css}').first().trigger('click');")
end
为什么?因为没有一个明显的替代方案奏效。
click_on('.special-div .submit') # Fails because click_on does not take CSS
# Cannot use click_button() because we are clicking on a <div>
find('.special-div .submit').click # Raises exception because there are more than one
first('.special-div .submit').click # Fails because the div is not visible
继续前进,@zetetic 询问是否
expect(click('.special-div .submit')).to have_css('.submitted')
会工作。不,它对我们不起作用,因为我们仍在使用 RSpec 2.9 并且该语法是在 2.11 中引入的,但即使我们升级它仍然无法工作,因为click
它不返回对象。click
如果我们升级到 2.11 并更改为 return ,它可能会起作用page
。