我将 poltergeist/phantomjs 用于 CI,但我希望能够有选择地将 JS 驱动程序更改为 selenium 以在本地观看我的测试运行。理想情况下,我希望为此默认 poltergeist 有一个命令行标志,但能够运行 rspec --driver=selenium (或类似的东西)
有任何想法吗?
我将 poltergeist/phantomjs 用于 CI,但我希望能够有选择地将 JS 驱动程序更改为 selenium 以在本地观看我的测试运行。理想情况下,我希望为此默认 poltergeist 有一个命令行标志,但能够运行 rspec --driver=selenium (或类似的东西)
有任何想法吗?
我有我认为可能是一个不那么老套的解决方案。我基本上是在抄袭 Jeff Perrin 的解决方案,但让它变得不那么复杂。
我DatabaseCleaner
只是设置为始终使用截断,因此无需有条件地配置该部分。
设置你的javascript_driver
这种方式:
# spec/spec_helper.rb
Capybara.javascript_driver = ENV['USE_SELENIUM_FOR_CAPYBARA'] ? :selenium : :webkit
如果我们总是明确地设置某些东西,我认为没有必要设置 Capybara 的默认驱动程序javascript_driver
。(杰夫可能知道一些我不知道的事情。)
这将使用 Webkit 作为驱动程序,除非您已USE_SELENIUM_FOR_CAPYBARA
在您的环境中设置。
如果您希望 RSpec 能够与任一驱动程序一起工作,您当然还应该在 Gemfile 中同时拥有 Selenium 和 Webkit 驱动程序 gem。
您可以从命令行设置一个可在 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
从来没有最终找到答案,所以这是我想出的 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
在特定行号处运行。
这个解决方案对我来说非常有效。我设置了一个环境变量并检查它的值。将此添加到您的 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 上运行