class SeleniumConnect::Job

encapsulates the creation of a driver and a run

Public Class Methods

new(config, report_factory, sauce_facade) click to toggle source
# File lib/selenium_connect/job.rb, line 14
def initialize(config, report_factory, sauce_facade)
  @config = config
  @report_factory = report_factory
  @sauce_facade = sauce_facade
end

Public Instance Methods

finish(opts = {}) click to toggle source

Finishes the driver run, taking any data to help, returning report

# File lib/selenium_connect/job.rb, line 32
def finish(opts = {})

  # extracted from the earlier main finish
  begin
    save_html
    if opts.key?(:failshot) && opts[:failshot] && @config.host != 'saucelabs'
      save_screenshot
    end
    @driver.quit
    @data = { assets: {} }
    process_sauce_logs(opts) if @config.host == 'saucelabs'
  # rubocop:disable HandleExceptions
  rescue Selenium::WebDriver::Error::WebDriverError
  # rubocop:enable HandleExceptions
  end
  @report_factory.build :job, @data
end
start(opts = {}) click to toggle source

Creates and returns the driver, using options passed in

# File lib/selenium_connect/job.rb, line 21
def start(opts = {})
  # TODO: this could be refactored out into an options parser of sorts
  @job_name = opts.key?(:name) ? slugify_name(opts[:name]) : 'unnamed_job'
  sauce_config = {}
  sauce_config.merge!(opts[:sauce_opts]) if opts.key? :sauce_opts
  sauce_config.merge!(job_name: @job_name)
  @config.sauce_opts = sauce_config
  @driver = Runner.new(@config).driver
end

Private Instance Methods

process_sauce_logs(opts = {}) click to toggle source
# File lib/selenium_connect/job.rb, line 66
def process_sauce_logs(opts = {})
  job_id = @driver.session_id
  @sauce_facade.job_id = job_id
  if opts.key?(:failed) && opts[:failed]
    status = 'failed'
    @sauce_facade.fail_job
    if opts.key?(:failshot) && opts[:failshot]
      screenshot = @sauce_facade.fetch_last_screenshot
    @data[:assets][:failshot] = save_asset('failshot.png', screenshot) if screenshot
    end
  end
  if opts.key?(:passed) && opts[:passed]
    status = 'passed'
    @sauce_facade.pass_job
  end
  server_log = @sauce_facade.fetch_server_log
  @data[:assets][:server_log] = save_asset('server.log', server_log) if server_log

  job_data = @sauce_facade.fetch_job_data
  @data[:sauce_data] = job_data if job_data

  job_data_log_file = 'sauce_job.log'
  @data[:assets][:job_data_log] = job_data_log_file
  @data = symbolize_keys @data
  save_asset(job_data_log_file, @data)
end
save_asset(filename, asset) click to toggle source
# File lib/selenium_connect/job.rb, line 93
def save_asset(filename, asset)
  if @config.log
    asset_file = File.join(Dir.getwd, @config.log, filename)
    File.open(asset_file, 'w') { |f| f.write asset }
    filename
  end
end
save_html() click to toggle source
# File lib/selenium_connect/job.rb, line 57
def save_html
  dom_number = 0
  @driver.window_handles.each do |handle|
    @driver.switch_to.window(handle)
    save_asset("dom_#{dom_number}.html", @driver.page_source)
    dom_number += 1
  end
end
save_screenshot() click to toggle source
# File lib/selenium_connect/job.rb, line 52
def save_screenshot
  path = File.join(Dir.getwd, @config.log, 'failshot.png')
  @driver.save_screenshot path
end
slugify_name(name) click to toggle source
# File lib/selenium_connect/job.rb, line 101
def slugify_name(name)
  name.downcase.strip.gsub(' ', '_').gsub(/[^\w-]/, '')
end
symbolize_keys(hash) click to toggle source

TODO: this should be pulled out into a generic report… or something

# File lib/selenium_connect/job.rb, line 106
def symbolize_keys(hash)
  hash.reduce({}) do |result, (key, value)|
    new_key = key.class == String ? key.to_sym : key
    new_value = value.class == Hash ? symbolize_keys(value) : value
    result[new_key] = new_value
    result
  end
end