class CapybaraHelper

Constants

DEFAULT_BROWSER
DEFAULT_DRIVER
DEFAULT_WAIT_TIME

Attributes

headless_mode[R]
parallel_tests_mode[R]
video_mode[R]

Public Class Methods

new() click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 13
def initialize
  Capybara.run_server = false

  if ENV['HEADLESS']
    begin
      require 'headless'

      @headless_mode = true
    rescue LoadError
      @headless_mode = false

      headless_mode_not_supported
    end
  end

  @video_mode = ENV['VIDEO'] ? true : false

  @parallel_tests_mode = ENV['TEST_ENV_NUMBER'] ? true : false
end

Public Instance Methods

after_test(name: nil, exception: nil) click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 80
def after_test name: nil, exception: nil
  Capybara.default_driver = @old_driver
  Capybara.current_driver = @old_driver
  Capybara.javascript_driver = @old_driver

  Capybara.app_host = nil

  Capybara.configure do |conf|
    conf.default_max_wait_time = @old_default_max_wait_time
  end

  if headless_mode
    if video_mode
      @headless.video.stop_and_save success_video_name(name)
    else
      if exception
        @headless.video.stop_and_save error_video_name(name, exception)
      else
        @headless.video.stop_and_discard
      end
    end

    @headless.destroy
  end
end
before_test(app_host:, driver: DEFAULT_DRIVER, browser: DEFAULT_BROWSER, wait_time: DEFAULT_WAIT_TIME) click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 33
def before_test(app_host:, driver: DEFAULT_DRIVER, browser: DEFAULT_BROWSER, wait_time: DEFAULT_WAIT_TIME)
  @old_driver = Capybara.current_driver

  driver_name = register_driver driver, browser: browser, selenium_url: nil, capabilities: nil

  use_driver(driver_name)

  Capybara.app_host = app_host

  @old_default_max_wait_time = Capybara.default_max_wait_time

  Capybara.configure do |conf|
    conf.default_max_wait_time = wait_time
  end

  if headless_mode
    headless_params = {}
    headless_params[:display] = 100 + test_number
    headless_params[:reuse] = parallel_tests_mode ? true : false
    headless_params[:dimensions] = "1280x900x24"

    headless_params[:video] = {
      frame_rate: 12,
      provider: :ffmpeg,
      codec: :libx264,
      pid_file_name:  "/tmp/.headless_ffmpeg_#{test_number}.pid",
      tmp_file_name:  "/tmp/.headless_ffmpeg_#{test_number}.mp4",
      extra: ['-pix_fmt yuv420p', '-b 6144k', '-b 6144k'],
      log_file_path: STDERR
    } if video_mode

    begin
      @headless = Headless.new headless_params

      @headless.start

      @headless.video.start_capture if video_mode
    rescue Headless::Exception
      @headless_mode = false

      headless_mode_not_supported
    end
  end

  driver_name
end
register_driver(driver, browser: DEFAULT_BROWSER, selenium_url: nil, capabilities: nil) click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 106
def register_driver driver, browser: DEFAULT_BROWSER, selenium_url: nil, capabilities: nil
  driver_name = build_driver_name(driver: driver, browser: browser, selenium_url: selenium_url)

  if driver == :selenium
    properties = {}

    if selenium_url
      properties[:browser] = :remote
      properties[:url] = selenium_url

      case browser
        when :firefox
          # profile = Selenium::WebDriver::Firefox::Profile.new
          # profile.enable_firebug
          # capabilities = Selenium::WebDriver::Remote::Capabilities.firefox(:firefox_profile => profile)

          caps = Selenium::WebDriver::Remote::Capabilities.firefox
        when :chrome
          caps = Selenium::WebDriver::Remote::Capabilities.chrome
        else
          caps = nil
      end

      desired_capabilities =
          if caps
            capabilities.each do |key, value|
              caps[key] = value
            end if capabilities

            caps
          elsif capabilities
            capabilities
          end

      properties[:desired_capabilities] = desired_capabilities if desired_capabilities
    else
      properties[:browser] = browser
    end

    Capybara.register_driver driver_name do |app|
      Capybara::Selenium::Driver.new(app, properties)
    end

  # elsif driver == :poltergeist
  #   require 'capybara/poltergeist'
  #
  #   properties = {}
  #   properties[:debug] = false
  #
  #   Capybara.register_driver :poltergeist do |app|
  #     Capybara::Poltergeist::Driver.new(app, properties)
  #   end
  #
  # elsif driver == :webkit
  #   require "capybara-webkit"
  end

  driver_name
end
take_screenshot() click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 166
def take_screenshot
  file_path = '/vagrant/screenshot.jpg'

  if headless_mode
    @headless.take_screenshot file_path, {using: :imagemagick}
  end
end

Private Instance Methods

build_driver_name(driver:, browser:, selenium_url: nil) click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 194
def build_driver_name driver:, browser:, selenium_url: nil
  case driver
    # when :webkit
    #   :webkit
    # when :poltergeist
    #   :poltergeist
    when :selenium
      name = ""
      name += driver ? "#{driver}_" : "#{Capybara.default_driver}_"

      name += "#{browser}_" if browser
      name += "remote" if selenium_url
      name = name[0..name.size-2] if name[name.size-1] == "_"

      name.to_sym
    else
      :unsupported
  end
end
error_video_name(name, exception) click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 180
def error_video_name name, exception
  exception_name = exception && exception.respond_to?(:name) ? exception.name : 'exception'

  "#{exception_name}_#{name}.mp4"
end
headless_mode_not_supported() click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 190
def headless_mode_not_supported
  puts "Headless mode is not supported on this OS."
end
success_video_name(name) click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 186
def success_video_name name
  "#{name}.mp4"
end
test_number() click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 176
def test_number
  parallel_tests_mode ? ENV['TEST_ENV_NUMBER'].to_i : 1
end
use_driver(driver) click to toggle source
# File lib/acceptance_test/capybara/capybara_helper.rb, line 214
def use_driver driver
  if driver and Capybara.drivers[driver]
    # Capybara.default_driver = driver
    Capybara.current_driver = driver
    Capybara.javascript_driver = driver
  end
end