site-object 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/site-object/page.rb +67 -13
- data/lib/site-object/site.rb +14 -12
- data/lib/site-object/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29b5d367c47596bba00efad173e605df63f4135e
|
4
|
+
data.tar.gz: 70b1d65e5519d8d0d9eda901157d462d3cb28cce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 04f664abd579838d75b3dd451899508e3493684fc4112afb3adb20ca1344a67089d12f94008daf6ce4ac075140ca8800d32e928569e21a93a9811f2b987b2d62
|
7
|
+
data.tar.gz: 0ce857445dbb62b554b26909a72672e2bde06e268d24012e1b58420da06c8971efffe6814c28244fc18356e860e39672747b4440fea4bf3270496d82744245fc
|
data/lib/site-object/page.rb
CHANGED
@@ -62,14 +62,10 @@
|
|
62
62
|
module PageObject
|
63
63
|
|
64
64
|
module PageClassMethods
|
65
|
-
|
66
|
-
|
67
|
-
# Looks up all of the descendants of the current class. Used to figure out which page object classes
|
68
|
-
# belong to the site.
|
69
|
-
def descendants
|
70
|
-
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
71
|
-
end
|
65
|
+
cattr_accessor :page_features # Page features should be inheritable so that page templates work.
|
66
|
+
attr_reader :page_attributes, :page_elements, :page_url, :url_template, :url_matcher
|
72
67
|
|
68
|
+
# DEPRECATED. Use the set_attributes method instead.
|
73
69
|
# This method can be used to disable page navigation when defining a page class (it sets an
|
74
70
|
# instance variable called @navigation during initialization.) The use case for this is a page
|
75
71
|
# that can't be accessed directly and requires some level of browser interaction to reach.
|
@@ -85,6 +81,9 @@ module PageObject
|
|
85
81
|
# If the visit method is called on the page a SiteObject::PageNavigationNotAllowedError
|
86
82
|
# will be raised.
|
87
83
|
def disable_automatic_navigation
|
84
|
+
puts "DEPRECATED. Will be removed in a future release. Use the set_attributes method in place of this one. See documentation for more details."
|
85
|
+
@page_attributes ||= []
|
86
|
+
@page_attributes << :navigation_disabled
|
88
87
|
@navigation_disabled = true
|
89
88
|
end
|
90
89
|
|
@@ -117,6 +116,54 @@ module PageObject
|
|
117
116
|
end
|
118
117
|
alias :el :element
|
119
118
|
|
119
|
+
# Allows you to set special page attributes that affect page behavior. The two page
|
120
|
+
# attributes currently supported are :navigation_disabled and :page_template:
|
121
|
+
#
|
122
|
+
# * When :navigation_disabled is specified as a page attribute, all automatic and
|
123
|
+
# manual browser navigation is disabled. If you call the page's page methods
|
124
|
+
# automatic navigation is turned off -- it won't automatically load the page for
|
125
|
+
# you. And it the method will raise a PageNavigationNotAllowedError if you call
|
126
|
+
# the page's accessor method while you aren't actually on the page. And finally,
|
127
|
+
# the page's visit method is disabled. This attribute is useful only when you
|
128
|
+
# have a page that can't be automatically navigated to, in which case all of
|
129
|
+
# the navigation features described above wouldn't work anyway.
|
130
|
+
#
|
131
|
+
# * When :page_template is specified as a page attribute, the site object won't
|
132
|
+
# create an accessor method for the page when initializing and also won't include
|
133
|
+
# the page when calling the site object's pages method. This allows you to define
|
134
|
+
# a page object for inheritance purposes only. The idea behind this is to put common
|
135
|
+
# features one or more of these templates, which won't get used directly. Then your
|
136
|
+
# other page objects that you actually do want to use can inherit from one of the
|
137
|
+
# templates, gaining all of its features. For example, you can put things like a
|
138
|
+
# logout link or common menus into a template and then have all of the page objects
|
139
|
+
# that need those features inherit from the template and get those features
|
140
|
+
# automatically.
|
141
|
+
#
|
142
|
+
# If an unsupported attribute is specified a PageConfigError will be raised.
|
143
|
+
#
|
144
|
+
# Usage:
|
145
|
+
# set_attributes :attr1, :attr2
|
146
|
+
def set_attributes(*args)
|
147
|
+
@page_attributes ||= []
|
148
|
+
args.each do |arg|
|
149
|
+
case arg
|
150
|
+
when :navigation_disabled
|
151
|
+
@navigation_disabled = true
|
152
|
+
when :page_template
|
153
|
+
@page_template = true
|
154
|
+
else
|
155
|
+
raise SiteObject::PageConfigError, "Unsupported page attribute argument: #{arg} for #{self} page definition. Argument class: #{arg.class}. Arguments must be one or more of the following symbols: :navigation_disabled, :template."
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
@page_attributes = args
|
160
|
+
end
|
161
|
+
|
162
|
+
def page_template?
|
163
|
+
@page_attributes ||= []
|
164
|
+
@page_attributes.include? :page_template
|
165
|
+
end
|
166
|
+
|
120
167
|
# Returns an array of symbols representing the required arguments for the page's page URL.
|
121
168
|
def required_arguments
|
122
169
|
@arguments ||= @url_template.keys.map { |k| k.to_sym }
|
@@ -255,12 +302,16 @@ module PageObject
|
|
255
302
|
#
|
256
303
|
# Use the PageFeature class to define page features.
|
257
304
|
def use_features(*args)
|
258
|
-
|
305
|
+
if self.page_features
|
306
|
+
args.each { |feature| self.page_features << feature }
|
307
|
+
else
|
308
|
+
self.page_features = args
|
309
|
+
end
|
259
310
|
end
|
260
311
|
end
|
261
312
|
|
262
313
|
module PageInstanceMethods
|
263
|
-
attr_reader :arguments, :browser, :
|
314
|
+
attr_reader :arguments, :browser, :page_attributes, :page_elements, :page_features, :page_url, :required_arguments, :site, :url_template, :url_matcher
|
264
315
|
|
265
316
|
# Takes the name of a page class. If the current page is of that class then it returns a page
|
266
317
|
# object for the page. Raises a SiteObject::WrongPageError if that's not the case.
|
@@ -275,7 +326,7 @@ module PageObject
|
|
275
326
|
# handle all of this for you.
|
276
327
|
def initialize(site, args={})
|
277
328
|
@browser = site.browser
|
278
|
-
@
|
329
|
+
@page_attributes = self.class.page_attributes
|
279
330
|
@page_url = self.class.page_url
|
280
331
|
@page_elements = self.class.page_elements
|
281
332
|
@page_features = self.class.page_features
|
@@ -318,7 +369,6 @@ module PageObject
|
|
318
369
|
# Do nothing here.
|
319
370
|
end
|
320
371
|
@url = @url_template.expand(@arguments).to_s
|
321
|
-
|
322
372
|
@page_features ||= []
|
323
373
|
@page_features.each do |arg|
|
324
374
|
self.class_eval do
|
@@ -337,7 +387,7 @@ module PageObject
|
|
337
387
|
|
338
388
|
@site.most_recent_page = self
|
339
389
|
unless on_page?
|
340
|
-
if
|
390
|
+
if navigation_disabled?
|
341
391
|
if page = @site.page
|
342
392
|
raise SiteObject::PageNavigationNotAllowedError, "The #{self.class.name} page could not be accessed. Navigation is intentionally disabled for this page and the browser was displaying the #{@site.page.class.name} page when you tried to access it.\n\nPAGE URL:\n------------\n#{@site.browser.url}\n\n#{caller.join("\n")}"
|
343
393
|
else
|
@@ -397,6 +447,10 @@ module PageObject
|
|
397
447
|
false
|
398
448
|
end
|
399
449
|
|
450
|
+
def navigation_disabled?
|
451
|
+
@page_attributes.include? :navigation_disabled
|
452
|
+
end
|
453
|
+
|
400
454
|
# Refreshes the page.
|
401
455
|
def refresh # TODO: Isolate browser library-specific code so that the adding a new browser library is cleaner.
|
402
456
|
if @browser.is_a?(Watir::Browser)
|
@@ -413,7 +467,7 @@ module PageObject
|
|
413
467
|
# navigation has been disabled for the page. Raises a SiteObject::WrongPageError if the
|
414
468
|
# specified page isn't getting displayed after navigation.
|
415
469
|
def visit
|
416
|
-
if
|
470
|
+
if navigation_disabled?
|
417
471
|
raise SiteObject::PageNavigationNotAllowedError, "Navigation has been disabled for the #{self.class.name} page. This was done when defining the page class and usually means that the page can't be reached directly through a URL and requires some additional work to access."
|
418
472
|
end
|
419
473
|
if @browser.is_a?(Watir::Browser)
|
data/lib/site-object/site.rb
CHANGED
@@ -77,25 +77,27 @@ module SiteObject
|
|
77
77
|
@arguments = args.with_indifferent_access
|
78
78
|
@base_url = @arguments[:base_url]
|
79
79
|
@browser = @arguments[:browser]
|
80
|
-
@pages = self.class::Page.descendants
|
80
|
+
@pages = self.class::Page.descendants.reject { |p| p.page_template? }
|
81
81
|
|
82
82
|
# Set up accessor methods for each page and page checking methods..
|
83
83
|
@pages.each do |current_page|
|
84
|
-
current_page.
|
84
|
+
unless current_page.page_template?
|
85
|
+
current_page.set_url_template(@base_url)
|
85
86
|
|
86
|
-
|
87
|
-
|
88
|
-
|
87
|
+
if current_page.url_matcher
|
88
|
+
unless current_page.url_matcher.is_a? Regexp
|
89
|
+
raise SiteObject::PageConfigError, "A url_matcher was defined for the #{current_page} page but it was not a regular expression. Check the value provided to the set_url_matcher method in the class definition for this page. Object provided was a #{current_page.url_matcher.class.name}"
|
90
|
+
end
|
89
91
|
end
|
90
|
-
end
|
91
92
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
93
|
+
self.class.class_eval do
|
94
|
+
define_method(current_page.to_s.underscore) do |args={}, block=nil|
|
95
|
+
current_page.new(self, args)
|
96
|
+
end
|
96
97
|
|
97
|
-
|
98
|
-
|
98
|
+
define_method("#{current_page.to_s.underscore}?") do
|
99
|
+
on_page? current_page
|
100
|
+
end
|
99
101
|
end
|
100
102
|
end
|
101
103
|
end
|
data/lib/site-object/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: site-object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Fitisoff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -80,11 +80,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
80
|
version: '0'
|
81
81
|
requirements: []
|
82
82
|
rubyforge_project: site-object
|
83
|
-
rubygems_version: 2.
|
83
|
+
rubygems_version: 2.4.5.1
|
84
84
|
signing_key:
|
85
85
|
specification_version: 4
|
86
86
|
summary: Wraps page objects up into a site object, which provides some introspection
|
87
87
|
and navigation capabilities that page objects don't provide. Works with Watir and
|
88
88
|
Selenium.
|
89
89
|
test_files: []
|
90
|
-
has_rdoc:
|