romikoops/howitzer

View on GitHub
lib/howitzer/capybara/settings.rb

Summary

Maintainability
D
1 day
Test Coverage
require 'selenium-webdriver'
require 'capybara'
require 'howitzer/utils/log'
require 'howitzer/helpers'
module Capybara
  module Settings
    extend self

    ##
    #
    # Predefined settings of Firefox browser
    #
    # *Returns:*
    # * +Hash+ - Settings that can be changed
    #


    def self.base_ff_profile_settings
      profile = ::Selenium::WebDriver::Firefox::Profile.new
      profile['network.http.phishy-userpass-length'] = 255
      profile['browser.safebrowsing.malware.enabled'] = false
      profile['network.automatic-ntlm-auth.allow-non-fqdn'] = true
      profile['network.ntlm.send-lm-response'] = true
      profile['network.automatic-ntlm-auth.trusted-uris'] = settings.app_host
      profile
    end

    class << self

      ##
      #
      #Defines driver based on specified test environment settings
      #

      def define_driver
        case settings.driver.to_s.to_sym
          when :selenium
            define_selenium_driver
          when :selenium_dev
            define_selenium_dev_driver
          when :webkit
            define_webkit_driver
          when :poltergeist
            define_poltergeist_driver
          when :phantomjs
            define_phantomjs_driver
          when :sauce
            define_sauce_driver
          when :testingbot
            define_testingbot_driver
          when :browserstack
            define_browserstack_driver
          when :selenium_grid
            define_selenium_grid_driver
          else
            log.error "Unknown '#{settings.driver}' driver. Check your settings, it should be one of [selenium, selenium_grid, selenium_dev, webkit, poltergeist, phantomjs, sauce, testingbot, browserstack]"
        end
      end

      private
      def define_selenium_grid_driver
        Capybara.register_driver :selenium_grid do |app|
          caps = if ie_browser?
            ::Selenium::WebDriver::Remote::Capabilities.internet_explorer
          elsif ff_browser?
            ::Selenium::WebDriver::Remote::Capabilities.firefox
          elsif chrome_browser?
            ::Selenium::WebDriver::Remote::Capabilities.chrome
          elsif opera_browser?
            ::Selenium::WebDriver::Remote::Capabilities.opera
          elsif safari_browser?
            ::Selenium::WebDriver::Remote::Capabilities.safari
          else
            log.error "Unknown '#{settings.sel_browser}' sel_browser. Check your settings, it should be one of [:ie, :iexplore, :ff, :firefox, :chrome, :opera, safari]"
          end

          Capybara::Selenium::Driver.new(app, :browser => :remote, :url => settings.sel_hub_url, :desired_capabilities => caps)
        end
      end

      def define_selenium_driver
        Capybara.register_driver :selenium do |app|
          params = {browser: settings.sel_browser.to_s.to_sym}
          params[:profile] = base_ff_profile_settings if ff_browser?
          Capybara::Selenium::Driver.new app, params
        end
      end

      def define_selenium_dev_driver
        Capybara.register_driver :selenium_dev do |app|
          profile = base_ff_profile_settings
          vendor_dir = settings.custom_vendor_dir || File.join(File.dirname(__FILE__), '..', 'vendor')
          log.error "Vendor directory was not found('#{vendor_dir}')." unless Dir.exist?(vendor_dir)
          %w(firebug*.xpi firepath*.xpi).each do |file_name|
            full_path_pattern = File.join(File.expand_path(vendor_dir), file_name)
            if (full_path = Dir[full_path_pattern].first)
              profile.add_extension full_path
            else
              log.error "Extension was not found by '#{full_path_pattern}' pattern!"
            end
          end
          profile['extensions.firebug.currentVersion']    = 'Last' # avoid 'first run' tab
          profile['extensions.firebug.previousPlacement'] = 1
          profile['extensions.firebug.onByDefault']       = true
          profile['extensions.firebug.defaultPanelName']  = 'firepath'
          profile['extensions.firebug.script.enableSites'] = true
          profile['extensions.firebug.net.enableSites'] = true
          profile['extensions.firebug.console.enableSites'] = true

          Capybara::Selenium::Driver.new app, browser: :firefox, profile: profile
        end
      end

      def define_webkit_driver
        require 'capybara-webkit'
      end

      def define_poltergeist_driver
        require 'capybara/poltergeist'
        Capybara.register_driver :poltergeist do |app|
          Capybara::Poltergeist::Driver.new(
            app, {
                 js_errors: !settings.pjs_ignore_js_errors,
                 phantomjs_options: ["--ignore-ssl-errors=#{settings.pjs_ignore_ssl_errors ? 'yes' : 'no'}" ]
               }
          )
        end
      end

      def define_phantomjs_driver
        Capybara.register_driver :phantomjs do |app|
          Capybara::Selenium::Driver.new(
            app, browser: :phantomjs,
            desired_capabilities: {
              javascript_enabled: !settings.pjs_ignore_js_errors
            },
            args: ["--ignore-ssl-errors=#{settings.pjs_ignore_ssl_errors ? 'yes' : 'no'}" ]
          )
        end
      end

      def define_sauce_driver
        task_name = rake_task_name
        caps_opts = {
          platform: settings.sl_platform,
          browser_name: settings.sl_browser_name,
          name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.sl_browser_name.upcase}",
          'max-duration' => settings.sl_max_duration,
          'idle-timeout' => settings.sl_idle_timeout,
          'selenium-version' => settings.sl_selenium_version,
          'record-screenshots' => settings.sl_record_screenshot,
          'video-upload-on-pass' => settings.sl_video_upload_on_pass
        }

        unless (settings.sl_browser_version.to_s || '').empty?
          caps_opts['version'] = settings.sl_browser_version.to_s
        end

        options = {
          url: settings.sl_url,
          desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
          http_client: ::Selenium::WebDriver::Remote::Http::Default.new.tap{|c| c.timeout = settings.timeout_medium},
          browser: :remote
        }

        Capybara.register_driver :sauce do |app|
          driver = Capybara::Selenium::Driver.new(app, options)
          driver.browser.file_detector = lambda do |args|
            str = args.first.to_s
            str if File.exist?(str)
          end
          driver
        end
      end

      def define_testingbot_driver
        require 'testingbot'
        task_name = rake_task_name
        caps_opts = {
          platform: settings.tb_platform,
          browser_name: settings.tb_browser_name,
          name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.tb_browser_name.upcase}",
          maxduration: settings.tb_max_duration.to_i,
          idletimeout: settings.tb_idle_timeout.to_i,
          'selenium-version' => settings.tb_selenium_version,
          screenshot: settings.tb_record_screenshot,
          'avoid-proxy' => settings.tb_avoid_proxy
        }

        unless (settings.tb_browser_version.to_s || "").empty?
          caps_opts['version'] = settings.tb_browser_version.to_s
        end
        options = {
          url: settings.tb_url,
          desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
          http_client: ::Selenium::WebDriver::Remote::Http::Default.new.tap{|c| c.timeout = settings.timeout_medium},
          browser: :remote
        }
        Capybara.register_driver :testingbot do |app|
          driver = Capybara::Selenium::Driver.new(app, options)
          driver.browser.file_detector = lambda do |args|
            str = args.first.to_s
            str if File.exist?(str)
          end
          driver
        end
      end
    end

    def define_browserstack_driver
      task_name = rake_task_name
      caps_opts = {
          name: "#{ENV['RAKE_TASK'] ? (task_name.empty? ? 'ALL' : task_name) : 'CUSTOM'} #{settings.bs_mobile ? settings.bs_m_browser : settings.bs_browser_name.upcase}",
          maxduration: settings.bs_max_duration.to_i,
          idletimeout: settings.bs_idle_timeout.to_i,
          project: settings.bs_project,
          build: settings.bs_build,
          resolution: settings.bs_resolution
      }

      if settings.bs_local
        caps_opts['browserstack.local'] = settings.bs_local
        caps_opts['browserstack.localIdentifier'] = settings.bs_local_ID
      end

      if settings.bs_mobile
        caps_opts[:browserName] = settings.bs_m_browser
        caps_opts[:platform] = settings.bs_m_platform
        caps_opts[:device] = settings.bs_m_device
      else
        caps_opts[:os] = settings.bs_os_name
        caps_opts[:os_version] = settings.bs_os_version
        caps_opts[:browser] = settings.bs_browser_name
        caps_opts[:browser_version] = settings.bs_browser_version
      end

      options = {
          url: settings.bs_url,
          desired_capabilities: ::Selenium::WebDriver::Remote::Capabilities.new(caps_opts),
          browser: :remote
      }
      Capybara.register_driver :browserstack do |app|
        driver = Capybara::Selenium::Driver.new(app, options)
        driver.browser.file_detector = lambda do |args|
          str = args.first.to_s
          str if File.exist?(str)
        end

        driver
      end
    end

    ##
    #
    # Returns url of current Sauce Labs job
    #
    # *Parameters:*
    # * +name+ - Your account name
    #
    # *Returns:*
    # * +string+ - URL address of last running Sauce Labs job
    #

    def sauce_resource_path(name)
      host = "https://#{settings.sl_user}:#{settings.sl_api_key}@saucelabs.com"
      path = "/rest/#{settings.sl_user}/jobs/#{session_id}/results/#{name}"
      "#{host}#{path}"
    end

    ##
    #
    # Sends http request to change current Sauce Labs job status - pass/fail
    #
    # *Parameters:*
    # * +json_data+ - test status as hash (for details see Saucelab documentation)
    #


    def update_sauce_job_status(json_data = {})
      host = "http://#{settings.sl_user}:#{settings.sl_api_key}@saucelabs.com"
      path = "/rest/v1/#{settings.sl_user}/jobs/#{session_id}"
      url = "#{host}#{path}"
      ::RestClient.put url, json_data.to_json, content_type: :json, accept: :json
    end

    ##
    #
    # Returns custom name for Sauce Labs job
    #
    # *Returns:*
    # * +string+ - Return name of current Sauce Labs job
    #

    def suite_name
      res = if ENV['RAKE_TASK']
              res = ENV['RAKE_TASK'].sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
              res.empty? ? 'ALL' : res
            else
              'CUSTOM'
            end
      "#{res} #{settings.sl_browser_name.upcase}"
    end

    ##
    #
    # Returns current session id
    #

    def session_id
      Capybara.current_session.driver.browser.instance_variable_get(:@bridge).session_id
    end

    ##
    #
    # Returns custom name for rake task
    #
    # *Returns:*
    # * +string+ - Returns rake task name
    #

    def rake_task_name
      ENV['RAKE_TASK'].to_s.sub(/(?:r?spec|cucumber):?(.*)/, '\1').upcase
    end

    Capybara.run_server = false
    Capybara.app_host = ''
    Capybara.asset_host = app_base_url
    Capybara.default_wait_time = settings.timeout_small
    Capybara.ignore_hidden_elements = true
    Capybara.visible_text_only = true
    Capybara.match = :one
    Capybara.exact_options = true
    Capybara.default_driver = settings.driver.to_s.to_sym
    Capybara.javascript_driver = settings.driver.to_s.to_sym

    define_driver

  end
end

# @deprecated
#
CapybaraSettings = Capybara::Settings