Class: Howitzer::Web::Page

Inherits:
Object
  • Object
show all
Includes:
CapybaraMethodsProxy, ElementDsl, IframeDsl, PageDsl, PageValidator, SectionDsl, RSpec::Matchers, RSpec::Wait, Singleton
Defined in:
lib/howitzer/web/page.rb

Overview

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

Direct Known Subclasses

BlankPage

Constant Summary collapse

UnknownPage =

:nodoc:

Class.new

Constants included from CapybaraMethodsProxy

CapybaraMethodsProxy::PROXIED_CAPYBARA_METHODS

Class Method Summary collapse

Instance Method Summary collapse

Methods included from PageValidator

#check_validations_are_defined!, included, validations

Methods included from SectionDsl

included

Methods included from CapybaraContextHolder

#capybara_context

Methods included from PageDsl

included

Methods included from IframeDsl

included

Methods included from ElementDsl

included

Methods included from CapybaraMethodsProxy

#click_alert_box

Constructor Details

#initializePage


154
155
156
157
# File 'lib/howitzer/web/page.rb', line 154

def initialize
  check_validations_are_defined!
  current_window.maximize if Howitzer.maximized_window && Howitzer.driver != 'headless_chrome'
end

Class Method Details

.current_pageString

Tries to identify current page name or raise the error if ambiguous page matching

Raises:


63
64
65
66
67
68
# File 'lib/howitzer/web/page.rb', line 63

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_urlString


86
87
88
# File 'lib/howitzer/web/page.rb', line 86

def self.current_url
  Capybara.current_session.current_url
end

.displayed?(timeout = Howitzer.page_load_idle_timeout) ⇒ Boolean

Waits until a web page is opened

Raises:


75
76
77
78
79
80
81
82
# File 'lib/howitzer/web/page.rb', line 75

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) ⇒ String

Returns an expanded page url for the page opening

Raises:


96
97
98
99
100
101
# File 'lib/howitzer/web/page.rb', line 96

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

.givenPage

Returns a singleton instance of the web page


53
54
55
56
# File 'lib/howitzer/web/page.rb', line 53

def self.given
  displayed?
  instance
end

.inherited(subclass) ⇒ Object

This Ruby callback makes all inherited classes as singleton classes.


29
30
31
# File 'lib/howitzer/web/page.rb', line 29

def self.inherited(subclass)
  subclass.class_eval { include Singleton }
end

.open(validate: true, url_processor: nil, **params) ⇒ Page

Note:

It tries to open the page twice and then raises the error if a validation is failed

Opens a web page in browser


40
41
42
43
44
45
46
47
48
# File 'lib/howitzer/web/page.rb', line 40

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

.path(value) ⇒ Object

DSL to specify an relative path pattern for the page opening

Examples:

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

See Also:


116
117
118
119
# File 'lib/howitzer/web/page.rb', line 116

def path(value)
  define_singleton_method(:path_value) { value.to_s }
  private_class_method :path_value
end

.site(value) ⇒ Object

Note:

By default it specifies Howitzer.app_uri.site as a site

DSL to specify a site for the page opening

Examples:

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

class LoginPage < AuthPage
  path '/login'
end

134
135
136
137
# File 'lib/howitzer/web/page.rb', line 134

def site(value)
  define_singleton_method(:site_value) { value }
  private_class_method :site_value
end

Instance Method Details

#reloadObject

Reloads current page in a browser


161
162
163
164
# File 'lib/howitzer/web/page.rb', line 161

def reload
  Howitzer::Log.info "Reload '#{current_url}'"
  visit current_url
end