class TestCentricity::PageObject
Public Class Methods
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
# File lib/testcentricity_web/web_core/page_object.rb, line 271 def self.audios(element_hash) element_hash.each(&method(:audio)) end
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
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
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
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
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
# File lib/testcentricity_web/web_core/page_object.rb, line 286 def self.filefields(element_hash) element_hash.each(&method(:filefield)) end
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
# File lib/testcentricity_web/web_core/page_object.rb, line 241 def self.images(element_hash) element_hash.each(&method(:image)) end
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
# File lib/testcentricity_web/web_core/page_object.rb, line 163 def self.labels(element_hash) element_hash.each(&method(:label)) end
Declare and instantiate a single link UI Element for this page object.
@param element_name [Symbol] name of link object (as a symbol) @param locator [String] CSS selector or XPath expression that uniquely identifies object @example
link :registration_link, 'a.account-nav__link.register' link :shopping_basket_link, "//a[@href='shopping_basket']"
# File lib/testcentricity_web/web_core/page_object.rb, line 175 def self.link(element_name, locator) define_page_element(element_name, TestCentricity::Link, locator) end
# File lib/testcentricity_web/web_core/page_object.rb, line 179 def self.links(element_hash) element_hash.each(&method(:link)) end
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
# File lib/testcentricity_web/web_core/page_object.rb, line 225 def self.lists(element_hash) element_hash.each(&method(:list)) end
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
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
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
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
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
# 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
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
# File lib/testcentricity_web/web_core/page_object.rb, line 210 def self.selectlists(element_hash) element_hash.each(&method(:selectlist)) end
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
# File lib/testcentricity_web/web_core/page_object.rb, line 194 def self.tables(element_hash) element_hash.each(&method(:table)) end
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
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
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
# 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
# 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
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
# 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
# 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
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 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
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
# 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
# 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
# File lib/testcentricity_web/web_core/page_object.rb, line 339 def verify_page_ui; end
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 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 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