【问题标题】:Waiting for redirect in Capybara Rails在 Capybara Rails 中等待重定向
【发布时间】:2014-08-13 16:48:44
【问题描述】:

我正在我的网站上进行一些内置 Spree 的集成测试。我正在使用 RSpec + Capybara 来进行这些测试。

我发现在较新版本的 Capybara 中,wait_until 已从源代码中删除,因为不再需要以这种方式等待 AJAX 请求。不知何故,现在 Capybara 足够聪明,可以等待 AJAX 请求。

我做的很简单:

visit product_path(product)
  within '.vip-buy-content' do
    first('.buy-button').click
  end
expect(page.current_path).to eq(cart_path)

当按钮被点击时,一个 AJAX 请求就完成了。当 AJAX 请求完成时,会发生重定向。

但是,期望失败了,因为 Capybara 似乎会比 AJAX 请求和重定向更快地处理这个。

如果在期望值之上添加“sleep 10”,则规范将通过,因为它有足够的时间来处理它。

我想要一种更好的方式来等待重定向。有什么想法吗?。

【问题讨论】:

    标签: ruby-on-rails ruby ajax rspec capybara


    【解决方案1】:

    我不知道这样能不能解决这个问题,但是我一般会在我的supports文件夹中添加一个wait_for_ajax.rb文件,然后创建一个这样的模块。

    module WaitForAjax
      def wait_for_ajax
        Timeout.timeout(Capybara.default_wait_time) do
          loop until finished_all_ajax_requests?
        end
      end
    
      def finished_all_ajax_requests?
        page.evaluate_script('jQuery.active').zero?
      end
    end
    
    RSpec.configure do |config|
      config.include WaitForAjax, type: :feature
    end
    

    然后添加

    visit product_path(product)
      within '.vip-buy-content' do
        first('.buy-button').click
      end
      wait_for_ajax
    expect(page.current_path).to eq(cart_path)
    

    我假设您在描述块上使用 :js=>true。希望这会有所帮助!

    【讨论】:

    • 我之前使用过这个替代方案,我在另一篇文章中找到了它。但是,它不起作用。
    • 这可能取决于您用于水豚的 javascript 引擎。我倾向于通过 gem poltergeist 使用 phantomjs,因为它是一个无头 javascript 引擎。
    • 我也在使用 Poltergeist 和 PhantomJS。我想我以前还不清楚:问题是我发出了 AJAX 请求,完成后用户将被重定向。有了这个,也许 Capybara 会等待 ajax 请求完成。但是,它可能会在重定向完成之前检查“太快”?
    • 老实说,我认为使用 this 或 sleep 是等待 ajax 请求的唯一方法。我也遇到了同样的问题,但是电脑的速度要慢得多,所以我不得不超时 30 秒。
    猜你喜欢
    • 2016-07-31
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2020-12-06
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多