【问题标题】:Capybara + Rspec: How to set up multi browser TC running?Capybara + Rspec:如何设置多浏览器TC运行
【发布时间】:2017-02-18 17:28:16
【问题描述】:

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

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

【问题讨论】:

    标签: ruby rspec automation capybara qa


    【解决方案1】:

    如果您碰巧通过这里寻找通过许多浏览器运行每个测试的方法,我根据 Thomas Walpole 接受的答案编写了这个(工作!)(过于健谈)sn-p:

    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
    

    输出结束是这样的:

    ~> 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

    【讨论】:

      【解决方案2】:

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

      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(取决于您是否使用需要 JS 的 rack_test 和标记测试运行一些测试)设置为您要用于运行测试的驱动程序。

      Capybara.default_driver = :selenium_chrome
      

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

      对于并行测试,您可以查看 parallel_tests gem - https://github.com/grosser/parallel_tests

      【讨论】:

      • 感谢您的帮助!但是有一个问题。我复制了您的代码并定义了浏览器“Capybara.default_driver = :selenium_firefox”。此外,我将我的测试标记为:'它“成功”,驱动程序::selenium_firefox 做'。它只是打开 FF 浏览器,但测试也不运行。我做错了什么?
      • @SerhiiKaihorodov 作为猜测-您正在使用 selenium-webdriver 2.53.4 和 FF > 47.0.1 -- 该版本的 selenium-webdriver 需要与 FF 47.0.1 或 45ESR 一起使用。有一个 beta 3 版本可以在与 geckodriver 一起使用时与较新的 FF 一起使用,但是有许多功能还不能完全工作。查看 Capybaras 自述文件的顶部 - github.com/jnicklas/capybara
      • 没错!非常感谢!
      • @SerhiiKaihorodov 不客气 - 如果它回答了您的问题并帮助了您,请不要忘记接受答案(复选标记)
      猜你喜欢
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多