首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Capybara + Rspec:如何设置多浏览器TC运行?

Capybara + Rspec:如何设置多浏览器TC运行?
EN

Stack Overflow用户
提问于 2016-10-10 10:00:34
回答 2查看 2.3K关注 0票数 2

我正在尝试设置环境,以便在不同的浏览器中运行我的TC。但目前TC只是在Chrome浏览器中正常运行,Firefox浏览器是打开的,但当我试图在FF、Opera、Safari浏览器中运行TC时,不会发生任何事情(测试场景不会运行)。如何调整我的设置,使之能够在所有浏览器中成功运行TC?还有一种方法可以并行运行TC吗?这是我的rails_helper.rb文件:

代码语言:javascript
复制
require 'test/unit'
require 'selenium-webdriver'
require 'capybara'
require 'rspec'
require "rails/all"
require 'capybara/rspec'
require "page-object"
require 'rspec/expectations'
require 'securerandom'
require '../Test_helpers/login_helper'
require 'capybara-screenshot/rspec'
require 'launchy'

RSpec.configure do |config|

  config.include LoginHelper
  config.include RSpec::Matchers
  config.include Capybara::DSL

  environment = 'firefox'

  if environment =='chrome'
    Selenium::WebDriver::Chrome.driver_path = '../Resources/chromedriver.exe'
    Capybara.default_driver = :chrome
    Capybara.register_driver :selenium do |app|
      options = {
          :js_errors => false,
          :timeout => 360,
          :debug => false,
          :inspector => false,
      }
      Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end
  elsif environment =='firefox'
    Capybara.default_driver = :firefox
    Capybara.register_driver :selenium do |app|
      options = {
          :js_errors => true,
          :timeout => 360,
          :debug => false,
          :inspector => false,
      }
      Capybara::Selenium::Driver.new(app, :browser => :firefox)
    end
  elsif environment == 'safari'
    Capybara.default_driver = :safari
    Capybara.register_driver :safari do |app|
      options = {
          :js_errors => false,
          :timeout => 360,
          :debug => false,
          :inspector => false,
      }
      Capybara::Selenium::Driver.new(app, :browser => :safari)
    end
  elsif environment == 'opera'
    Capybara.default_driver = :opera
    Capybara.register_driver :opera do |app|
      options = {
          :js_errors => false,
          :timeout => 360,
          :debug => false,
          :inspector => false,
      }
      Capybara::Selenium::Driver.new(app, :browser => :opera)
    end
  elsif
  Capybara.default_driver = :poltergeist
    Capybara.register_driver :poltergeist do |app|
      options = {
          :js_errors => false,
          :timeout => 360,
          :debug => false,
          :phantomjs_options => ['--load-images=no', '--disk-cache=false'],
          :inspector => false,
      }
      Capybara::Poltergeist::Driver.new(app, options)
    end
  end

  Capybara.save_path = "../Reports" # path where screenshots are saved

  config.after { |example_group| CapybaraScreenshot.save_and_open_page_path if example_group.exception }

  Capybara::Screenshot.register_filename_prefix_formatter(:rspec) do |example|
    "screenshot_#{example.description.gsub(' ', '-').gsub(/^.*\/spec\//, '')}"
  end

end

Capybara.default_max_wait_time = 15
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-24 09:11:21

如果您碰巧通过这里寻找通过许多浏览器运行每个测试的方法,我写了这个(工作!)(过于健谈)基于托马斯·沃尔波尔公认的答案的片段:

代码语言:javascript
复制
Rspec.configure do |conf|

  Capybara.register_driver :chrome do |mode|
      Capybara::Selenium::Driver.new mode, :browser => :remote, :desired_capabilities => :chrome
    end

    Capybara.register_driver :firefox do |mode|
      Capybara::Selenium::Driver.new mode, :browser => :remote, :desired_capabilities => :firefox
  end

  ## Here we politely ask every example to run twice, for each browser we want
  conf.around do |example|
    puts '~> ' + example.metadata[:example_group][:full_description]
    # avoid looping over Capybara.drivers as it will also contain "selenium" generic driver and "rack_test" basic (js-less) browser
    [:chrome, :firefox].each do |browser|
      Capybara.current_driver = browser
      puts "~~> #{example.description} @ #{browser}"
      example.run
    end
  end

  Capybara.default_driver = :chrome
end

输出的结尾类似于:

代码语言:javascript
复制
~> The contact page
~~> loads @ chrome
~~> loads @ firefox
.

Finished in 20.9 seconds (files took 2.69 seconds to load)
1 example, 0 failures

显然,所有的puts行都可以删除/注释掉,它们只是为了示例目的而存在:)

在每一行~~>之后,所述浏览器将打开并运行该示例。

但是,必须注意将:js => true从示例中删除,否则Capybara将强制对默认的javascript_driver运行它们。

票数 1
EN

Stack Overflow用户

发布于 2016-10-10 16:32:09

您要传递给您注册的驱动程序的选项只对poltergeist有效。您可以注册所有的驱动程序,然后使用所需的驱动程序,而不是大的if/否则。

代码语言:javascript
复制
RSpec.configure do |config|

  config.include LoginHelper # You probably want to only include this for feature tests
  config.include RSpec::Matchers # not needed if you use the standard capybara rspec setup by including capybara/rspec
  config.include Capybara::DSL # not needed if you use the standard capybara rspec setup by including capybara/rspec

  end

  Capybara.save_path = "../Reports" # path where screenshots are saved

  config.after { |example_group| CapybaraScreenshot.save_and_open_page_path if example_group.exception }

  Capybara::Screenshot.register_filename_prefix_formatter(:rspec) do |example|
    "screenshot_#{example.description.gsub(' ', '-').gsub(/^.*\/spec\//, '')}"
  end

end

    Selenium::WebDriver::Chrome.driver_path = '../Resources/chromedriver.exe'
    Capybara.register_driver :selenium_chrome do |app|
      Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end

    Capybara.register_driver :selenium_firefox do |app|
      Capybara::Selenium::Driver.new(app, :browser => :firefox)
    end

    Capybara.register_driver :selenium_safari do |app|
      Capybara::Selenium::Driver.new(app, :browser => :safari)
    end

    Capybara.register_driver :selenium_opera do |app|
      Capybara::Selenium::Driver.new(app, :browser => :opera)
    end

    Capybara.register_driver :poltergeist do |app|
      options = {
          :js_errors => false,
          :timeout => 360,
          :debug => false,
          :phantomjs_options => ['--load-images=no', '--disk-cache=false'],
          :inspector => false,
      }
      Capybara::Poltergeist::Driver.new(app, options)
    end

然后将Capybara.default_driver和/或Capybara.javascript_driver (取决于是否使用rack_test和标签测试运行某些需要JS的测试)设置为要用于运行测试的驱动程序。

代码语言:javascript
复制
Capybara.default_driver = :selenium_chrome

要在多个浏览器上运行所有测试,正常的做法是将CI系统配置为多次运行,并为每次运行设置不同的驱动程序(例如,基于环境变量)。如果您需要在一次运行中全部运行它们,您可以让您的RSpec测试全部共享示例,然后配置包含共享示例的测试块,但每个测试块在一个前置块中设置一个不同的驱动程序。

对于并行测试,您可以查看parallel_tests gems - tests

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39955782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档