class Howitzer::Web::Page

This class represents a single web page. This is a parent class for all web pages

Public Class Methods

current_page() click to toggle source

Tries to identify current page name or raise the error if ambiguous page matching @return [String] a page name @raise [UnknownPage] when no any matched pages @raise [AmbiguousPageMatchingError] when matched more than 1 page

# File lib/howitzer/web/page.rb, line 65
def self.current_page
  page_list = matched_pages
  return UnknownPage if page_list.count.zero?
  return page_list.first if page_list.count == 1

  raise Howitzer::AmbiguousPageMatchingError, ambiguous_page_msg(page_list)
end
current_url() click to toggle source

@return [String] current page url from browser

# File lib/howitzer/web/page.rb, line 90
def self.current_url
  Capybara.current_session.current_url
end
displayed?(timeout = Howitzer.page_load_idle_timeout) click to toggle source

Waits until a web page is opened @param timeout [Integer] time in seconds a required web page to be loaded @return [Boolean] @raise [IncorrectPageError] when timeout expired and the page is not displayed

# File lib/howitzer/web/page.rb, line 78
def self.displayed?(timeout = Howitzer.page_load_idle_timeout)
  end_time = ::Time.now + timeout
  until ::Time.now > end_time
    return true if opened?

    sleep(0.5)
  end
  raise Howitzer::IncorrectPageError, incorrect_page_msg
end
expanded_url(params = {}, url_processor = nil) click to toggle source

Returns an expanded page url for the page opening @param params [Array] placeholders and their values @param url_processor [Class] custom url processor. For details see Addressable gem @return [String] @raise [NoPathForPageError] if an url is not specified for the page

# File lib/howitzer/web/page.rb, line 100
def self.expanded_url(params = {}, url_processor = nil)
  if defined?(path_value)
    return "#{site_value}#{Addressable::Template.new(path_value).expand(params, url_processor)}"
  end

  raise Howitzer::NoPathForPageError, "Please specify path for '#{self}' page. Example: path '/home'"
end
given() click to toggle source

Returns a singleton instance of the web page @return [Page]

# File lib/howitzer/web/page.rb, line 55
def self.given
  displayed?
  instance
end
inherited(subclass) click to toggle source

This Ruby callback makes all inherited classes as singleton classes.

Calls superclass method
# File lib/howitzer/web/page.rb, line 30
def self.inherited(subclass)
  super
  subclass.class_eval { include Singleton }
end
new() click to toggle source
# File lib/howitzer/web/page.rb, line 165
def initialize
  check_validations_are_defined!
  current_window.maximize if Howitzer.maximized_window &&
                             !%w[chrome headless_chrome].include?(Capybara.current_driver)
end
open(validate: true, url_processor: nil, **params) click to toggle source

Opens a web page in browser @note It tries to open the page twice and then raises the error if a validation is failed @param validate [Boolean] if fase will skip current page validation (is opened) @param url_processor [Class] custom url processor. For details see ‘addressable’ gem @param params [Array] placeholder names and their values @return [Page]

# File lib/howitzer/web/page.rb, line 42
def self.open(validate: true, url_processor: nil, **params)
  url = expanded_url(params, url_processor)
  Howitzer::Log.info "Open #{name} page by '#{url}' url"
  retryable(tries: 2, logger: Howitzer::Log, trace: true, on: Exception) do |retries|
    Howitzer::Log.info 'Retry...' unless retries.zero?
    Capybara.current_session.visit(url)
  end
  given if validate
end

Protected Class Methods

path(value) click to toggle source

DSL to specify an relative path pattern for the page opening @param value [String] a path pattern, for details please see Addressable gem @see .site @example

class ArticlePage < Howitzer::Web::Page
  url '/articles/:id'
end
ArticlePage.open(id: 10)

@!visibility public

# File lib/howitzer/web/page.rb, line 127
def path(value)
  define_singleton_method(:path_value) { value.to_s }
  private_class_method :path_value
end
site(value) click to toggle source

DSL to specify a site for the page opening @note By default it specifies Howitzer.app_uri.site as a site @param value [String] a site as combination of protocol, host and port @example

class AuthPage < Howitzer::Web::Page
  site 'https:/example.com'
end

class LoginPage < AuthPage
  path '/login'
end

@!visibility public

# File lib/howitzer/web/page.rb, line 145
def site(value)
  define_singleton_method(:site_value) { value }
  private_class_method :site_value
end

Private Class Methods

ambiguous_page_msg(page_list) click to toggle source
# File lib/howitzer/web/page.rb, line 157
def ambiguous_page_msg(page_list)
  "Current page matches more that one page class (#{page_list.join(', ')}).\n" \
    "\tCurrent url: #{current_url}\n\tCurrent title: #{instance.title}"
end
incorrect_page_msg() click to toggle source
# File lib/howitzer/web/page.rb, line 152
def incorrect_page_msg
  "Current page: #{current_page}, expected: #{self}.\n" \
    "\tCurrent url: #{current_url}\n\tCurrent title: #{instance.title}"
end

Public Instance Methods

meta() click to toggle source

Provides access to meta information about entities on the page @return [Meta::Entry]

# File lib/howitzer/web/page.rb, line 110
def meta
  @meta ||= Meta::Entry.new(self)
end
reload() click to toggle source

Reloads current page in a browser

# File lib/howitzer/web/page.rb, line 173
def reload
  Howitzer::Log.info "Reload '#{current_url}'"
  visit current_url
end