我是Rspec的新手,在这里我正在尝试测试其中一个集成测试。当我(使用Capybara)单击按钮时,页面内容将被替换为后期响应。现在我正在检查页面内容,它出现在页面上,但我的测试仍然失败。 以下是规范
it "get force check takeover1" do
visit('/las_xml')
select('Showroom', :from => 'urlVal')
fill_in('fpHeaderForce', :with => 'PSD.L.Syn')
fill_in('currentDate', :with => '2013-09-11')
click_button('submit')
page.should have_content('Buy 2013 Labor Law Posters')
end
但结果是,
1) las box get force check takeover1
Failure/Error: page.should have_content('Test page')
expected #has_content?("Buy 2013 Labor Law Posters") to return true, got false
# ./integration/las_box_spec.rb:19:in `block (2 levels) in <top (required)>'
和结果响应html包含,
<div class="las-link" id="">
<div class="laborLink_actual labor_01">
<span class="laborLink"></span>
<a href="#">Buy 2013 Labor Law Posters</a>
</div>
</div>
答案 0 :(得分:6)
如果您确实测试了html页面,因为结果摘录似乎显示,可能有以下几种可能性:
您要测试的文字不是实际的。仔细检查没有拼写错误,如果有多语言网站
可能隐藏包含文本的元素。如果内容不可见,Capybara将不会认为该内容存在
上一次点击按钮可能根本无效或可能会导致其他页面
由于失败只是真正问题的症状,我们可以使用调试功能处理所有问题:
page.save_screenshot( filename )
:将屏幕截图保存到指定的文件名(例如,'shot.png')save_and_open_page
:在浏览器中打开可检查的html页面binding.pry
:来自pry
gem,对检查上下文始终有用有关通过poltergeist创建屏幕截图的示例,请参阅this。
正如评论中所提到的,问题似乎与javascript内容编辑有关。
您仍然应该使用前面提到的调试来确保隔离您的问题。完成后,您可以使用capybara的#synchronize方法等待您的内容:
page.document.synchronize( 10 ) do
result = page.evaluate_script %($(':contains("Post")').length)
raise Capybara::ElementNotFound unless result > 0
end
同步方法将重试10秒,只要包含块引发Capybara::ElementNotFound
异常(没有捕获任何其他异常)。所以基本上,在这里,我们检查(使用jQuery)是否在页面中显示“Post”内容,并重试直到它或直到十秒过去。
如果找不到元素,则通过引发未捕获的异常来测试将失败。
如果找到元素,您现在可以继续进行常规测试。这允许在规格中添加时序条件。