Ruby on rails 水豚面临页面问题的Rspec

Ruby on rails 水豚面临页面问题的Rspec,ruby-on-rails,ruby,rspec,capybara,Ruby On Rails,Ruby,Rspec,Capybara,我是Rspec的新手,在这里我尝试测试一个集成测试。当我(使用水豚)点击按钮时,页面内容将替换为post响应。现在我正在检查页面内容,它显示在页面上,但我的测试仍然失败。 以下是规格 it "get force check takeover1" do visit('/las_xml') select('Showroom', :from => 'urlVal') fill_in('fpHeaderForce', :with => 'PSD.L.Syn')

我是Rspec的新手,在这里我尝试测试一个集成测试。当我(使用水豚)点击按钮时,页面内容将替换为post响应。现在我正在检查页面内容,它显示在页面上,但我的测试仍然失败。 以下是规格

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)>'
1)las盒获取强制检查接管1
失败/错误:第页应包含内容(“测试页”)
预计#has#u content?(“购买2013年劳动法海报”)将返回true,但返回false
#./integration/las_box_spec.rb:19:in‘块(2层)in’
结果响应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>

可能的原因 如果您确实在测试一个html页面,正如您的结果摘录所显示的那样,那么可能存在以下几种可能性:

  • 您尝试测试的文本不是实际文本。如果有多个语言网站,请仔细检查是否有拼写错误,并使用相同的语言环境

  • 包含文本的元素可能被隐藏。如果不可见,

  • ,水痘不会认为存在。
  • 上一个单击按钮可能根本不起作用,或者可能导致另一个页面

  • 隔离问题的方法 与水豚一样,由于失败只是实际问题的症状,我们可以使用调试功能处理所有问题:

    • page.save\u屏幕截图(文件名)
      :将屏幕截图保存到给定的文件名(例如,“shot.png”)
    • 保存并打开页面
      :在浏览器中打开可检查的html页面
    • binding.pry
      :从
      pry
      gem,检查上下文总是有用的
    有关通过恶鬼创建屏幕截图的示例,请参阅

    编辑:动态页面问题 正如评论中提到的,这个问题似乎和javascript内容编辑有关

    您仍然应该使用前面提到的调试,以确保隔离问题。完成后,您可以使用capybara的方法等待您的内容:

    page.document.synchronize( 10 ) do
      result = page.evaluate_script %($(':contains("Post")').length)
      raise Capybara::ElementNotFound unless result > 0
    end
    
    只要包含块引发
    Capybara::ElementNotFound
    异常(任何其他异常都不会被捕获),同步方法将重试10秒钟。所以基本上,在这里,我们检查(使用jQuery)页面中是否存在“Post”内容,然后重试,直到它出现或十秒钟过去

    若未找到元素,测试将通过引发未捕获的异常而失败

    如果找到元素,您现在可以继续进行常规测试。这允许在规格中添加定时条件。

    可能的原因 如果您确实在测试一个html页面,正如您的结果摘录所显示的那样,那么可能存在以下几种可能性:

  • 您尝试测试的文本不是实际文本。如果有多个语言网站,请仔细检查是否有拼写错误,并使用相同的语言环境

  • 包含文本的元素可能被隐藏。如果不可见,

  • ,水痘不会认为存在。
  • 上一个单击按钮可能根本不起作用,或者可能导致另一个页面

  • 隔离问题的方法 与水豚一样,由于失败只是实际问题的症状,我们可以使用调试功能处理所有问题:

    • page.save\u屏幕截图(文件名)
      :将屏幕截图保存到给定的文件名(例如,“shot.png”)
    • 保存并打开页面
      :在浏览器中打开可检查的html页面
    • binding.pry
      :从
      pry
      gem,检查上下文总是有用的
    有关通过恶鬼创建屏幕截图的示例,请参阅

    编辑:动态页面问题 正如评论中提到的,这个问题似乎和javascript内容编辑有关

    您仍然应该使用前面提到的调试,以确保隔离问题。完成后,您可以使用capybara的方法等待您的内容:

    page.document.synchronize( 10 ) do
      result = page.evaluate_script %($(':contains("Post")').length)
      raise Capybara::ElementNotFound unless result > 0
    end
    
    只要包含块引发
    Capybara::ElementNotFound
    异常(任何其他异常都不会被捕获),同步方法将重试10秒钟。所以基本上,在这里,我们检查(使用jQuery)页面中是否存在“Post”内容,然后重试,直到它出现或十秒钟过去

    若未找到元素,测试将通过引发未捕获的异常而失败


    如果找到元素,您现在可以继续进行常规测试。这允许在规范中添加计时条件。

    我对“/las_xml”路由有点困惑。这是否意味着您在单击按钮后会得到一个xml文件?另外,请确保元素可见,
    #have_content
    如果隐藏,则返回false。不,这只是一个名称,因为我将XML作为ajax post数据的一部分发送,并将同一页面html替换为响应html,而yes元素在页面上可见。我对“/las_XML”路径有点困惑。这是否意味着您在单击按钮后会得到一个xml文件?另外,请确保您的元素可见,
    #have_content
    如果隐藏则返回false。不,这只是一个名称,因为我正在将XML作为ajax post数据的一部分发送,并将同一页面html替换为响应html,并且yes元素在页面上可见。感谢您的快速回复。我试过用非常小的单词,比如“page”,只是为了拼写错误和其他。此外,包含文本的元素在页面上可见。可能会出现这样的问题,我有一个模板,我从中调用ajax“Post”,并使用innerHTML属性将同一页面的全部内容替换为响应HTML。因为当我试图搜索替换为响应“test successfuls”之前存在的文本时,搜索的不是新替换的Html。但是我不知道如何解决这个问题。谢谢你的快速回复。我试过用非常小的单词,比如“page”,只是为了拼写错误和其他。此外,包含文本的元素在页面上可见。可能会有这样的问题,我有一个模板,我从中给ajax“Post”调用