dtaniwaki/e2e-tester

View on GitHub
app/models/browser/browserstack.rb

Summary

Maintainability
A
3 hrs
Test Coverage
module Browser
  class Browserstack < Base
    validates :os, :os_version, presence: true

    def self.update_source
      browsers = if Settings.browserstack.username.present? && Settings.browserstack.password.present?
        client = ::Browserstack::Automate::Client.new(username: Settings.browserstack.username, password: Settings.browserstack.password)
        client.browsers
      end
      browsers || []
    end

    def self.available_for?(user)
      Settings.application.misc.use_global_browserstack_credential || user.browserstack_credential.present?
    end

    def name
      super.presence || device.presence || "#{browser} #{browser_version}"
    end

    def full_name
      ['Browserstack', os, os_version, browser, browser_version, device].compact.join(' ')
    end

    # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
    def driver(credential = nil)
      caps = Selenium::WebDriver::Remote::Capabilities.new
      caps['device']          = device          if device.present?
      caps['browser']         = browser         if browser.present?
      caps['browser_version'] = browser_version if browser_version.present?
      caps['os']              = os              if os.present?
      caps['os_version']      = os_version      if os_version.present?
      caps['name']            = name            if name.present?
      caps['browserstack.debug'] = true

      caps.javascript_enabled = true
      caps.css_selectors_enabled = true
      caps.takes_screenshot = true

      if credential
        username = credential.username
        password = credential.password
      elsif Settings.application.misc.use_global_browserstack_credential && Settings.browserstack.username.present?
        username = Settings.browserstack.username
        password = Settings.browserstack.password
      else
        raise 'You need to set up a crendetial'
      end
      url = "http://#{username}:#{password}@hub.browserstack.com/wd/hub"
      driver = Selenium::WebDriver.for :remote, url: url, desired_capabilities: caps

      at_exit do
        if driver
          begin
            driver.quit
          rescue
            nil
          end
        end
      end

      driver
    end
    # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
  end
end