class TestCentricity::PageObject

Public Class Methods

audio(element_name, locator) click to toggle source

Declare and instantiate a single HTML5 audio UI Element for this page object.

@param element_name [Symbol] name of an HTML5 audio object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

audio :audio_player, 'audio#my_audio_player'
# File lib/testcentricity_web/web_core/page_object.rb, line 267
def self.audio(element_name, locator)
  define_page_element(element_name, TestCentricity::Audio, locator)
end
audios(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 271
def self.audios(element_hash)
  element_hash.each(&method(:audio))
end
button(element_name, locator) click to toggle source

Declare and instantiate a single button UI Element for this page object.

@param element_name [Symbol] name of button object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

button :checkout_button, 'button.checkout_button'
button :login_button,    "//input[@id='submit_button']"
# File lib/testcentricity_web/web_core/page_object.rb, line 34
def self.button(element_name, locator)
  define_page_element(element_name, TestCentricity::Button, locator)
end
buttons(element_hash) click to toggle source

Declare and instantiate a collection of buttons for this page object.

@param element_hash [Hash] names of buttons (as a symbol) and CSS selectors or XPath expressions that uniquely identifies buttons @example

buttons new_account_button:  'button#new-account',
        save_button:         'button#save',
        cancel_button:       'button#cancel'
# File lib/testcentricity_web/web_core/page_object.rb, line 46
def self.buttons(element_hash)
  element_hash.each(&method(:button))
end
checkbox(element_name, locator, proxy = nil) click to toggle source

Declare and instantiate a single checkbox UI Element for this page object.

@param element_name [Symbol] name of checkbox object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @param proxy [Symbol] Optional name (as a symbol) of proxy object to receive click actions @example

checkbox :remember_checkbox,     "//input[@id='RememberUser']"
checkbox :accept_terms_checkbox, 'input#accept_terms_conditions', :accept_terms_label
# File lib/testcentricity_web/web_core/page_object.rb, line 108
def self.checkbox(element_name, locator, proxy = nil)
  class_eval(%(def #{element_name};@#{element_name} ||= TestCentricity::CheckBox.new("#{element_name}", self, "#{locator}", :page, #{proxy});end))
end
checkboxes(element_hash) click to toggle source

Declare and instantiate a collection of checkboxes for this page object.

@param element_hash [Hash] names of checkboxes (as a symbol) and CSS selectors or XPath expressions that uniquely identifies checkboxes @example

checkboxes  hazmat_certified_check:  'input#hazmatCertified',
            epa_certified_check:     'input#epaCertified',
            dhs_certified_check:     'input#homelandSecurityCertified',
            carb_compliant_check:    'input#carbCompliant'
# File lib/testcentricity_web/web_core/page_object.rb, line 121
def self.checkboxes(element_hash)
  element_hash.each(&method(:checkbox))
end
element(element_name, locator) click to toggle source

Declare and instantiate a single generic UI Element for this page object.

@param element_name [Symbol] name of UI object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

element :settings_item, 'a#userPreferencesTrigger'
# File lib/testcentricity_web/web_core/page_object.rb, line 10
def self.element(element_name, locator)
  define_page_element(element_name, TestCentricity::UIElement, locator)
end
elements(element_hash) click to toggle source

Declare and instantiate a collection of generic UI Elements for this page object.

@param element_hash [Hash] names of UI objects (as a symbol) and CSS selectors or XPath expressions that uniquely identifies objects @example

elements  profile_item:  'a#profile',
          settings_item: 'a#userPreferencesTrigger',
          log_out_item:  'a#logout'
# File lib/testcentricity_web/web_core/page_object.rb, line 22
def self.elements(element_hash)
  element_hash.each(&method(:element))
end
filefield(element_name, locator) click to toggle source

Declare and instantiate a single File Field UI Element for this page object.

@param element_name [Symbol] name of file field object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

filefield :attach_file, 's_SweFileName'
# File lib/testcentricity_web/web_core/page_object.rb, line 282
def self.filefield(element_name, locator)
  define_page_element(element_name, TestCentricity::FileField, locator)
end
filefields(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 286
def self.filefields(element_hash)
  element_hash.each(&method(:filefield))
end
image(element_name, locator) click to toggle source

Declare and instantiate an single image UI Element for this page object.

@param element_name [Symbol] name of image object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

image :basket_item_image,    'div.product_image'
image :corporate_logo_image, "//img[@alt='MyCompany_logo']"
# File lib/testcentricity_web/web_core/page_object.rb, line 237
def self.image(element_name, locator)
  define_page_element(element_name, TestCentricity::Image, locator)
end
images(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 241
def self.images(element_hash)
  element_hash.each(&method(:image))
end
label(element_name, locator) click to toggle source

Declare and instantiate a single label UI Element for this page object.

@param element_name [Symbol] name of label object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

label :welcome_label,      'div.Welcome'
label :rollup_price_label, "//div[contains(@id, 'Rollup Item Price')]"
# File lib/testcentricity_web/web_core/page_object.rb, line 159
def self.label(element_name, locator)
  define_page_element(element_name, TestCentricity::Label, locator)
end
labels(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 163
def self.labels(element_hash)
  element_hash.each(&method(:label))
end
list(element_name, locator) click to toggle source

Declare and instantiate a single list UI Element for this page object.

@param element_name [Symbol] name of list object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

list :x_axis_list, 'g.x-axis'
# File lib/testcentricity_web/web_core/page_object.rb, line 221
def self.list(element_name, locator)
  define_page_element(element_name, TestCentricity::List, locator)
end
lists(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 225
def self.lists(element_hash)
  element_hash.each(&method(:list))
end
radio(element_name, locator, proxy = nil) click to toggle source

Declare and instantiate a single radio button UI Element for this page object.

@param element_name [Symbol] name of radio object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @param proxy [Symbol] Optional name (as a symbol) of proxy object to receive click actions @example

radio :accept_terms_radio,  "//input[@id='Accept_Terms']"
radio :decline_terms_radio, '#decline_terms_conditions', :decline_terms_label
# File lib/testcentricity_web/web_core/page_object.rb, line 134
def self.radio(element_name, locator, proxy = nil)
  class_eval(%(def #{element_name};@#{element_name} ||= TestCentricity::Radio.new("#{element_name}", self, "#{locator}", :page, #{proxy});end))
end
radios(element_hash) click to toggle source

Declare and instantiate a collection of radio buttons for this page object.

@param element_hash [Hash] names of radio buttons (as a symbol) and CSS selectors or XPath expressions that uniquely identifies radio buttons @example

radios  visa_radio:       'input#payWithVisa',
        mastercard_radio: 'input#payWithMastercard',
        discover_radio:   'input#payWithDiscover',
        amex_radio:       'input#payWithAmEx'
# File lib/testcentricity_web/web_core/page_object.rb, line 147
def self.radios(element_hash)
  element_hash.each(&method(:radio))
end
range(element_name, locator) click to toggle source

Declare and instantiate a single range input UI Element for this page object.

@param element_name [Symbol] name of range input object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

range :volume_level, "//input[@id='volume_slider']"
range :points_slider, 'input#points'
# File lib/testcentricity_web/web_core/page_object.rb, line 84
def self.range(element_name, locator)
  define_page_element(element_name, TestCentricity::Range, locator)
end
ranges(element_hash) click to toggle source

Declare and instantiate a collection of range inputs for this page object.

@param element_hash [Hash] names of ranges (as a symbol) and CSS selectors or XPath expressions that uniquely identifies the ranges @example

ranges points_slider: 'input#points',
       risk_slider:   'input#risk_percentage'
# File lib/testcentricity_web/web_core/page_object.rb, line 95
def self.ranges(element_hash)
  element_hash.each(&method(:range))
end
section(section_name, obj, locator = nil) click to toggle source

Instantiate a single PageSection object for this page object.

@param section_name [Symbol] name of PageSection object (as a symbol) @param class_name [String] Class name of PageSection object @example

section :search_form, SearchForm
# File lib/testcentricity_web/web_core/page_object.rb, line 297
def self.section(section_name, obj, locator = nil)
  define_method(section_name) do
    ivar_name = "@#{section_name}"
    ivar = instance_variable_get(ivar_name)
    return ivar if ivar
    instance_variable_set(ivar_name, obj.new(section_name, self, "#{locator}", :page))
  end
end
sections(section_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 306
def self.sections(section_hash)
  section_hash.each do |section_name, class_name|
    section(section_name, class_name)
  end
end
selectlist(element_name, locator) click to toggle source

Declare and instantiate a single select list UI Element for this page object.

@param element_name [Symbol] name of select list object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

selectlist :category_selector, 'select#search_form_category_chosen'
selectlist :gender_select,     "//select[@id='customer_gender']"
# File lib/testcentricity_web/web_core/page_object.rb, line 206
def self.selectlist(element_name, locator)
  define_page_element(element_name, TestCentricity::SelectList, locator)
end
selectlists(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 210
def self.selectlists(element_hash)
  element_hash.each(&method(:selectlist))
end
table(element_name, locator) click to toggle source

Declare and instantiate a single table UI Element for this page object.

@param element_name [Symbol] name of table object (as a symbol) @param locator [String] XPath expression that uniquely identifies object @example

table :payments_table, "//table[@class='payments_table']"
# File lib/testcentricity_web/web_core/page_object.rb, line 190
def self.table(element_name, locator)
  define_page_element(element_name, TestCentricity::Table, locator)
end
tables(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 194
def self.tables(element_hash)
  element_hash.each(&method(:table))
end
textfield(element_name, locator) click to toggle source

Declare and instantiate a single text field UI Element for this page object.

@param element_name [Symbol] name of text field object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

textfield :user_id_field,  "//input[@id='UserName']"
textfield :password_field, 'input#consumer_password'
# File lib/testcentricity_web/web_core/page_object.rb, line 58
def self.textfield(element_name, locator)
  define_page_element(element_name, TestCentricity::TextField, locator)
end
textfields(element_hash) click to toggle source

Declare and instantiate a collection of text fields for this page object.

@param element_hash [Hash] names of text fields (as a symbol) and CSS selectors or XPath expressions that uniquely identifies text fields @example

textfields  name_field:    'input#Name',
            title_field:   'input#Title',
            phone_field:   'input#PhoneNumber',
            fax_field:     'input#FaxNumber',
            email_field:   'input#Email'
# File lib/testcentricity_web/web_core/page_object.rb, line 72
def self.textfields(element_hash)
  element_hash.each(&method(:textfield))
end
video(element_name, locator) click to toggle source

Declare and instantiate a single HTML5 video UI Element for this page object.

@param element_name [Symbol] name of an HTML5 video object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example

video :video_player, 'video#my_video_player'
# File lib/testcentricity_web/web_core/page_object.rb, line 252
def self.video(element_name, locator)
  define_page_element(element_name, TestCentricity::Video, locator)
end
videos(element_hash) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 256
def self.videos(element_hash)
  element_hash.each(&method(:video))
end

Private Class Methods

define_page_element(element_name, obj, locator) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 470
def self.define_page_element(element_name, obj, locator)
  define_method(element_name) do
    ivar_name = "@#{element_name}"
    ivar = instance_variable_get(ivar_name)
    return ivar if ivar
    instance_variable_set(ivar_name, obj.new(element_name, self, locator, :page))
  end
end

Public Instance Methods

exists?() click to toggle source

Does Page object exists?

@return [Boolean] @example

home_page.exists?
# File lib/testcentricity_web/web_core/page_object.rb, line 365
def exists?
  raise "Page object #{self.class.name} does not have a page_locator trait defined" unless defined?(page_locator)
  saved_wait_time = Capybara.default_max_wait_time
  Capybara.default_max_wait_time = 0.1
  tries ||= 2
  attributes = [:id, :css, :xpath]
  type = attributes[tries]
  obj = page.find(type, page_locator)
  obj != nil
rescue
  Capybara.default_max_wait_time = saved_wait_time
  retry if (tries -= 1) > 0
  false
ensure
  Capybara.default_max_wait_time = saved_wait_time
end
load_page() click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 341
def load_page
  return if exists?
  if defined?(page_url) && !page_url.nil?
    visit page_url
    begin
      page.driver.browser.switch_to.alert.accept
    rescue => e
    end unless Environ.browser == :safari || Environ.browser == :ie || Environ.is_device?
  else
    navigate_to
  end
  verify_page_exists
end
navigate_to() click to toggle source
open_portal() click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 312
def open_portal
  environment = Environ.current
  url = environment.hostname.blank? ? "#{environment.base_url}#{environment.append}" : "#{environment.hostname}/#{environment.base_url}#{environment.append}"
  if environment.user_id.blank? || environment.password.blank?
    visit "#{environment.protocol}://#{url}"
  else
    visit "#{environment.protocol}://#{environment.user_id}:#{environment.password}@#{url}"
  end
  Environ.portal_state = :open
end
secure?() click to toggle source

Is current Page object URL secure?

@return [Boolean] @example

home_page.secure?
# File lib/testcentricity_web/web_core/page_object.rb, line 464
def secure?
  current_url.start_with?('https')
end
send_keys(*keys) click to toggle source

Send keystrokes to the focused element on a Page object

@param keys [String] keys @example

editor_page.send_keys([:control, 'z'])
# File lib/testcentricity_web/web_core/page_object.rb, line 398
def send_keys(*keys)
  focused_obj = page.driver.browser.switch_to.active_element
  focused_obj.send_keys(*keys)
end
title() click to toggle source

Return page title

@return [String] @example

home_page.title
# File lib/testcentricity_web/web_core/page_object.rb, line 388
def title
  page.driver.browser.title
end
verify_page_contains(content) click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 355
def verify_page_contains(content)
  raise "Expected page to have content '#{content}'" unless page.has_content?(:visible, content)
end
verify_page_exists() click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 323
def verify_page_exists
  raise "Page object #{self.class.name} does not have a page_locator trait defined" unless defined?(page_locator)
  unless page.has_selector?(page_locator)
    body_class = find(:xpath, '//body')[:class]
    error_message = %(
      Expected page to have selector '#{page_locator}' but found '#{body_class}' instead.
      Actual URL of page loaded = #{URI.parse(current_url)}.
      )
    error_message = "#{error_message}\nExpected URL of page was #{page_url}." if defined?(page_url)
    raise error_message
  end
  PageManager.current_page = self
end
verify_page_ui() click to toggle source
# File lib/testcentricity_web/web_core/page_object.rb, line 339
def verify_page_ui; end
wait_for_ajax(seconds = nil) click to toggle source

Wait until all AJAX requests have completed, or until the specified wait time has expired. If the wait time is nil, then the wait time will be Capybara.default_max_wait_time.

@param seconds [Integer or Float] wait time in seconds @example

shopping_basket_page.wait_for_ajax(15)
# File lib/testcentricity_web/web_core/page_object.rb, line 448
def wait_for_ajax(seconds = nil)
  wait_time = seconds.nil? ? Capybara.default_max_wait_time : seconds
  Timeout.timeout(wait_time) do
    loop do
      active = page.evaluate_script('jQuery.active')
      break if active.zero?
    end
  end
end
wait_until_exists(seconds = nil, post_exception = true) click to toggle source

Wait until the page object exists, or until the specified wait time has expired. If the wait time is nil, then the wait time will be Capybara.default_max_wait_time.

@param seconds [Integer or Float] wait time in seconds @example

home_page.wait_until_exists(15)
# File lib/testcentricity_web/web_core/page_object.rb, line 410
def wait_until_exists(seconds = nil, post_exception = true)
  timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
  wait.until { exists? }
rescue
  if post_exception
    raise "Page object #{self.class.name} not found after #{timeout} seconds" unless exists?
  else
    exists?
  end
end
wait_until_gone(seconds = nil, post_exception = true) click to toggle source

Wait until the page object no longer exists, or until the specified wait time has expired. If the wait time is nil, then the wait time will be Capybara.default_max_wait_time.

@param seconds [Integer or Float] wait time in seconds @example

payment_processing_page.wait_until_gone(15)
# File lib/testcentricity_web/web_core/page_object.rb, line 429
def wait_until_gone(seconds = nil, post_exception = true)
  timeout = seconds.nil? ? Capybara.default_max_wait_time : seconds
  wait = Selenium::WebDriver::Wait.new(timeout: timeout)
  wait.until { !exists? }
rescue
  if post_exception
    raise "Page object #{self.class.name} remained visible after #{timeout} seconds" if exists?
  else
    exists?
  end
end