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)


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

def connector_is_saucelabs?
  MiniAutobot.settings.connector.include? 'saucelabs'
end

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

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

Returns:

  • (Boolean)


199
200
201
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 199

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)


204
205
206
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 204

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

#json_save_to_ever_failedObject

Create new/override same file ever_failed_tests.json with fail count



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 93

def json_save_to_ever_failed
  ever_failed_tests = 'logs/tap_results/ever_failed_tests.json'
  data_hash = {}
  if File.file?(ever_failed_tests) && !File.zero?(ever_failed_tests)
    data_hash = JSON.parse(File.read(ever_failed_tests))
  end

  if data_hash[name]
    data_hash[name]["fail_count"] += 1
  else
    data_hash[name] = { "fail_count" => 1 }
  end
  begin
    data_hash[name]["last_fail_on_sauce"] = "saucelabs.com/tests/#{@driver.session_id}"
  rescue
    self.logger.debug "Failed setting last_fail_on_sauce, driver may not be available"
  end

  File.open(ever_failed_tests, 'w+') do |file|
    file.write JSON.pretty_generate(data_hash)
  end
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



118
119
120
121
122
123
124
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 118

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)


157
158
159
160
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 157

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)


166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 166

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
  value
end

#retry_with_count(count, &block) ⇒ Object

Retry a block of code for a number of times



184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 184

def retry_with_count(count, &block)
  try = 0
  count.times do
    try += 1
    begin
      block.call
      return true
    rescue Exception => e
      MiniAutobot.logger.warn "Exception: #{e}\nfrom\n#{block.source_location.join(':')}"
      MiniAutobot.logger.warn "Retrying" if try < count
    end
  end
end

#save_to_ever_failedObject

Save test name to ever_failed_tests file only for the first time it failed



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

def save_to_ever_failed
  ever_failed_tests = 'logs/tap_results/ever_failed_tests'
  File.open(ever_failed_tests, 'a') do |f|
    existing_failed_tests = File.readlines(ever_failed_tests).map do |line|
      line.delete "\n"
    end
    f.puts name unless existing_failed_tests.include? name
  end
end

#take_screenshotObject

Take screenshot and save as png with test name as file name



77
78
79
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 77

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
74
# File 'lib/mini_autobot/utils/page_object_helper.rb', line 59

def teardown
  if !passed? && !skipped? && !@driver.nil?
    json_save_to_ever_failed if MiniAutobot.settings.rerun_failure
    print_sauce_link if connector_is_saucelabs?
    take_screenshot
  end
  begin
    update_sauce_session 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

#update_sauce_sessionObject

Update SauceLabs session(job) name Update session(job) status if test is not skipped

Raises:

  • (ArgumentError)


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

def update_sauce_session
  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}"
  body = { "name" => name(), "tags" => [new_tags] }
  body["passed"] = passed? unless skipped?
  RestClient.put(http_auth, body.to_json, {:content_type => "application/json"})
end