【问题标题】:Rspec+Capybara optionally change JS driverRspec+Capybara 可选更改 JS 驱动
【发布时间】:2013-09-01 08:00:35
【问题描述】:

我将 poltergeist/phantomjs 用于 CI,但我希望能够有选择地将 JS 驱动程序更改为 selenium 以在本地观看我的测试运行。理想情况下,我希望为此默认 poltergeist 有一个命令行标志,但能够运行 rspec --driver=selenium (或类似的东西)

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    从来没有最终找到答案,所以这是我想出的 hacky 解决方案:

    我发现唯一可以可靠更改的是标记系统。所以我调用 using -t 视觉标签,然后把它拿走。

    在 spec/spec_helper.rb 中

    Rspec.configure do |config|
      if config.filter_manager.inclusions[:visual]
        Capybara.javascript_driver = :selenium
        config.filter_manager.inclusions.delete(:visual)
      else
        Capybara.javascript_driver = :poltergeist
      end
    
    ~rest of rspec config code~
    

    现在您可以使用 rspec (tests to run) -t visual 运行测试
    这样做的主要问题是它会阻止您运行特定的测试。您仍然可以使用 rspec spec/features/signup_spec.rb -t visual 执行单个文件,但不能添加 :54 以在特定行号处运行。

    【讨论】:

    • 不,你实际上可以添加一个行号:54 来运行特定的测试,至少在 2015 年和 2016 年,但我不记得在 2014 年是否也可以。跨度>
    【解决方案2】:

    您可以从命令行设置一个可在 spec/spec_helper.rb 中使用的环境变量:

    DEBUG = ENV['DEBUG'] || false
    if DEBUG
      Capybara.default_driver = :selenium
    else
      Capybara.default_driver = :rack_test
      Capybara.javascript_driver = :poltergeist
    end
    

    然后可以像这样从命令行运行:

    DEBUG=true rspec spec/features/my_spec.rb:35

    这将允许您指定特定的行号。

    您可能还必须根据所使用的水豚驱动程序(即,使用数据库清理器)更改清理策略:

    RSpec.configure do |config|
      config.before(:suite) do
        if DEBUG
          DatabaseCleaner.strategy = :truncation
        else
          DatabaseCleaner.strategy = :transaction
        end
    
        DatabaseCleaner.clean_with(:truncation)
      end
    end
    

    如果你想变得花哨,可以将它与这个 stackoverflow 答案结合使用:https://stackoverflow.com/a/5150855/95683 以减慢 selenium 在 DEBUG 模式下运行规范时运行规范的速度:

    config.before(:each) do |group|
      set_speed :slow if DEBUG
    end
    

    【讨论】:

      【解决方案3】:

      我有一个我认为可能不那么老套的解决方案。我基本上是在抄袭 Jeff Perrin 的解决方案,但让它变得不那么复杂。

      我的DatabaseCleaner 只是设置为始终使用截断,因此无需有条件地配置该部分。

      这样设置你的javascript_driver

      # spec/spec_helper.rb
      
      Capybara.javascript_driver = ENV['USE_SELENIUM_FOR_CAPYBARA'] ? :selenium : :webkit
      

      如果我们总是明确地将 javascript_driver 设置为某些东西,我认为没有必要设置 Capybara 的默认驱动程序。 (Jeff 可能知道一些我不知道的事情。)

      这将使用 Webkit 作为驱动程序,除非您在环境中设置了 USE_SELENIUM_FOR_CAPYBARA

      如果您希望 RSpec 能够与任一驱动程序一起运行,您当然还应该在 Gemfile 中同时拥有 Selenium 和 Webkit 驱动程序 gem。

      【讨论】:

        【解决方案4】:

        这个解决方案非常适合我。我设置了一个环境变量并检查它的值。将此添加到您的 spec_helper.rb 文件中

        if ENV['DRIVER'] =='poltergeist' # use any driver you want to run on circlci
          Capybara.default_driver = :poltergeist
          URL = # use your own end point like http://www.localhost:8080
        else
           Capybara.default_driver = :selenium
           URL = # Use your end point
        end 
        Capybara.configure do |config|
          config.app_host = URL
        end
        

        然后在控制台上运行这个命令

        DRIVER=poltergeist rspec //用于在 poltergeist 上运行测试

        rspec //用于在 selenium 上运行

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          • 2015-02-13
          • 2017-10-25
          • 1970-01-01
          相关资源
          最近更新 更多