【问题标题】:Capybara config after each page load每次页面加载后的 Capybara 配置
【发布时间】:2016-06-10 17:06:16
【问题描述】:

我正在寻找一种通用方法来配置 RSpec Capybara 以在测试示例中的每个页面加载后执行某些操作。

例子:

config.after_page_load do
  execute_script('window.analyticsEvents = []; window.analytics = function(name, properties) { analyticsEvents.push([name, properties]) }')
end

然后我可以在我的功能测试中检查该数组。

我能想到的“全局”配置的唯一其他选项是在视图中使用if Rails.env.test?

有没有更好的办法?

【问题讨论】:

  • 在视图中有条件地运行 JS 是我唯一能想到的。 * 颤抖 *
  • 啊,是的。这就是我最终做的。我想我可能会错过一种更巧妙的方式。

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


【解决方案1】:

我猜你可以修补 #visit 以在每次访问调用后始终执行你的 JS - 但似乎你正在尝试做一些 Capybara 真正不适合做的事情,并且可能没有意义做.

【讨论】:

  • 谢谢你,汤姆。我并不总是打电话拜访。大多数时候它只是通过点击页面上的按钮来重定向
  • @PetrGazarov 那么 Capybara 没有办法做到这一点 - 它不知道以这种方式触发的页面更改,除非您专门检查页面上的可见更改。
【解决方案2】:

我在尝试monitor slow network requests 时遇到了这个问题。虽然最终不需要它,但以下操作成功:

module CapybaraHooks
  def after_page_change

  end

  Capybara::Session::DSL_METHODS.each do |method|
    define_method method do |*args, &block|
      old_page = page.current_url
      super(*args, &block)
      new_page = page.current_url

      puts "Command #{method}"
      if old_page != new_page
        puts "Changed from #{old_page} to #{new_page}"
        after_page_change
      else
        puts "Still on page: #{new_page}"
      end
    end
  end
end

RSpec.configure do |config|
  config.include CapybaraHooks, type: :feature
end

【讨论】:

    最近更新 更多