Module: MiniAutobot::Utils::PageObjectHelper

Included in:
PageObjects::Base, PageObjects::Overlay::Base, PageObjects::Widgets::Base, TestCase
Defined in:
lib/mini_autobot/utils/page_object_helper.rb

Overview

Page object-related helper methods.

Instance Method Summary collapse

Instance Method Details

#connector_is_saucelabs?Boolean

Returns:

  • (Boolean)


116
117
118
119
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 116

def connector_is_saucelabs?
  return true if MiniAutobot.settings.connector.include?('saucelabs')
  return false
end

#is_element_present?(how, what, driver = nil) ⇒ Boolean

Check if a web element exists on page or not, without wait

Returns:

  • (Boolean)


150
151
152
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 150

def is_element_present?(how, what, driver = nil)
  element_appeared?(how, what, driver)
end

#is_element_present_and_displayed?(how, what, driver = nil) ⇒ Boolean

Check if a web element exists and displayed on page or not, without wait

Returns:

  • (Boolean)


155
156
157
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 155

def is_element_present_and_displayed?(how, what, driver = nil)
  element_appeared?(how, what, driver, check_display = true)
end

#page(name, override_driver = nil) ⇒ PageObject::Base

Helper method to instantiate a new page object. This method should only be used when first loading; subsequent page objects are automatically instantiated by calling #cast on the page object.

Pass optional parameter Driver, which can be initialized in test and will override the global driver here.

Parameters:

  • name (String, Driver)

Returns:

  • (PageObject::Base)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 16

def page(name, override_driver=nil)
  # Get the fully-qualified class name
  klass_name = "mini_autobot/page_objects/#{name}".camelize
  klass = begin
    klass_name.constantize
  rescue => exc
    msg = ""
    msg << "Cannot find page object '#{name}', "
    msg << "because could not load class '#{klass_name}' "
    msg << "with underlying error:\n  #{exc.class}: #{exc.message}\n"
    msg << exc.backtrace.map { |str| "    #{str}" }.join("\n")
    raise NameError, msg
  end

  # Get a default connector
  @driver = MiniAutobot::Connector.get_default if override_driver.nil?
  @driver = override_driver if !override_driver.nil?
  instance = klass.new(@driver)

  # Before visiting the page, do any pre-processing necessary, if any,
  # but only visit the page if the pre-processing succeeds
  if block_given?
    retval = yield instance
    instance.go! if retval
  else
    instance.go! if override_driver.nil?
  end

  # similar like casting a page, necessary to validate some element on a page
  begin
    instance.validate!
  rescue Minitest::Assertion => exc
    raise MiniAutobot::PageObjects::InvalidePageState, "#{klass}: #{exc.message}"
  end

  # Return the instance as-is
  instance
end

Print out a link of a saucelabs’s job when a test is not passed Rescue to skip this step for tests like cube tracking



81
82
83
84
85
86
87
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 81

def print_sauce_link
  begin
    puts "Find test on saucelabs: https://saucelabs.com/tests/#{@driver.session_id}"
  rescue
    puts 'can not retrieve driver session id, no link to saucelabs'
  end
end

#put_value(web_element, value) ⇒ Object

Generic page object helper method to clear and send keys to a web element found by driver

Parameters:

  • (Element, String)


123
124
125
126
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 123

def put_value(web_element, value)
  web_element.clear
  web_element.send_keys(value)
end

#read_yml(file_name, keys) ⇒ Object

Helper method for retrieving value from yml file todo should be moved to FileHelper.rb once we created this file in utils keys, eg. “timeouts:implicit_wait”

Parameters:

  • (String, String)


132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 132

def read_yml(file_name, keys)
  data = Hash.new
  begin
    data = YAML.load_file "#{file_name}"
  rescue
    raise Exception, "File #{file_name} doesn't exist" unless File.exist?(file_name)
  rescue
    raise YAMLErrors, "Failed to load #{file_name}"
  end
  keys_array = keys.split(/:/)
  value = data
  keys_array.each do |key|
    value = value[key]
  end
  return value
end

#set_sauce_session_nameObject

update session name on saucelabs

Raises:

  • (ArgumentError)


90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 90

def set_sauce_session_name
  # identify the user who runs the tests and grab user's access_key
  # where are we parsing info from run command to in the code?
  connector = MiniAutobot.settings.connector # eg. saucelabs:phu:win7_ie11
  overrides = connector.to_s.split(/:/)
  new_tags = overrides[2]+"_by_"+overrides[1]
  file_name = overrides.shift
  path = MiniAutobot.root.join('config/mini_autobot', 'connectors')
  filepath  = path.join("#{file_name}.yml")
  raise ArgumentError, "Cannot load profile #{file_name.inspect} because #{filepath.inspect} does not exist" unless filepath.exist?

  cfg = YAML.load(File.read(filepath))
  cfg = Connector.resolve(cfg, overrides)
  cfg.freeze
  username = cfg["hub"]["user"]
  access_key = cfg["hub"]["pass"]

  require 'json'
  session_id = @driver.session_id
  http_auth = "https://#{username}:#{access_key}@saucelabs.com/rest/v1/#{username}/jobs/#{session_id}"
  # to_json need to: require "active_support/core_ext", but will mess up the whole framework, require 'json' in this method solved it
  body = {"name" => name(), "tags" => [new_tags]}.to_json
  # gem 'rest-client'
  RestClient.put(http_auth, body, {:content_type => "application/json"})
end

#take_screenshotObject



75
76
77
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 75

def take_screenshot
  @driver.save_screenshot("logs/#{name}.png")
end

#teardownvoid

This method returns an undefined value.

Local teardown for page objects. Any page objects that are loaded will be finalized upon teardown.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 59

def teardown
  if !passed? && !skipped? && !@driver.nil?
    take_screenshot
    print_sauce_link if connector_is_saucelabs?
  end
  begin
    set_sauce_session_name if connector_is_saucelabs? && !@driver.nil?
    self.logger.debug "Finished setting saucelabs session name for #{name()}"
  rescue
    self.logger.debug "Failed setting saucelabs session name for #{name()}"
  end

  MiniAutobot::Connector.finalize!
  super
end