ae_page_objects 1.5.0 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ae_page_objects.rb +32 -23
- data/lib/ae_page_objects/core/application_router.rb +1 -26
- data/lib/ae_page_objects/element_proxy.rb +0 -20
- data/lib/ae_page_objects/elements/collection.rb +10 -14
- data/lib/ae_page_objects/version.rb +1 -1
- metadata +6 -15
- data/lib/ae_page_objects/core/rake_router.rb +0 -152
- data/lib/ae_page_objects/util/waiter.rb +0 -32
- data/lib/ae_page_objects/window.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2dec9e34721561ba781508ef0b2c14b254fa4f5f
|
4
|
+
data.tar.gz: 33356ca72c8529bbb1c64169c42c290c545b486b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ff183bf91b4049702f1fbb32192e7f92d05e279743c1091e0a5740ea50dc89ccf595a7fdefa3ae7c3cdf14a77fef9c3f214d9ad5a8f1bcf58d5ae4b6b9e12ea
|
7
|
+
data.tar.gz: 4b7c1c3de1d8f16b7f38b2cfaf4f67e5b5f0b1671b614d0be8a5e147bcf568104c82e00362d06428e2bebce6bdd29c939acb486441a8efd343eea461056b2ecf
|
data/lib/ae_page_objects.rb
CHANGED
@@ -9,14 +9,12 @@ module AePageObjects
|
|
9
9
|
autoload :Site, 'ae_page_objects/core/site'
|
10
10
|
autoload :BasicRouter, 'ae_page_objects/core/basic_router'
|
11
11
|
autoload :ApplicationRouter, 'ae_page_objects/core/application_router'
|
12
|
-
autoload :RakeRouter, 'ae_page_objects/core/rake_router'
|
13
12
|
autoload :Dsl, 'ae_page_objects/core/dsl'
|
14
13
|
|
15
14
|
autoload :Singleton, 'ae_page_objects/util/singleton'
|
16
15
|
autoload :InternalHelpers, 'ae_page_objects/util/internal_helpers'
|
17
16
|
autoload :HashSymbolizer, 'ae_page_objects/util/hash_symbolizer'
|
18
17
|
autoload :Inflector, 'ae_page_objects/util/inflector'
|
19
|
-
autoload :Waiter, 'ae_page_objects/util/waiter'
|
20
18
|
|
21
19
|
module MultipleWindows
|
22
20
|
autoload :Browser, 'ae_page_objects/multiple_windows/browser'
|
@@ -32,8 +30,6 @@ module AePageObjects
|
|
32
30
|
autoload :SameWindowLoaderStrategy, 'ae_page_objects/single_window/same_window_loader_strategy'
|
33
31
|
end
|
34
32
|
|
35
|
-
autoload :Window, 'ae_page_objects/window'
|
36
|
-
|
37
33
|
autoload :DocumentQuery, 'ae_page_objects/document_query'
|
38
34
|
autoload :DocumentLoader, 'ae_page_objects/document_loader'
|
39
35
|
|
@@ -48,35 +44,48 @@ module AePageObjects
|
|
48
44
|
autoload :Select, 'ae_page_objects/elements/select'
|
49
45
|
autoload :Checkbox, 'ae_page_objects/elements/checkbox'
|
50
46
|
|
51
|
-
|
52
|
-
@browser ||= begin
|
53
|
-
driver = Capybara.current_session.driver
|
47
|
+
class << self
|
54
48
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
49
|
+
def browser
|
50
|
+
@browser ||= begin
|
51
|
+
driver = Capybara.current_session.driver
|
52
|
+
|
53
|
+
case driver
|
54
|
+
when Capybara::Selenium::Driver then
|
55
|
+
MultipleWindows::Browser.new
|
56
|
+
else
|
57
|
+
SingleWindow::Browser.new
|
58
|
+
end
|
60
59
|
end
|
61
60
|
end
|
62
|
-
end
|
63
61
|
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
def wait_until(seconds_to_wait = nil, error_message = nil)
|
63
|
+
seconds_to_wait ||= default_max_wait_time
|
64
|
+
start_time = Time.now
|
65
|
+
|
66
|
+
until result = yield
|
67
|
+
delay = seconds_to_wait - (Time.now - start_time)
|
67
68
|
|
68
|
-
|
69
|
-
|
69
|
+
if delay <= 0
|
70
|
+
raise WaitTimeoutError, error_message || "Timed out waiting for condition"
|
71
|
+
end
|
70
72
|
|
71
|
-
|
72
|
-
raise
|
73
|
+
sleep(0.05)
|
74
|
+
raise FrozenInTime, "Time appears to be frozen" if Time.now == start_time
|
73
75
|
end
|
74
76
|
|
75
|
-
|
76
|
-
raise FrozenInTime, "Time appears to be frozen" if Time.now == start_time
|
77
|
+
result
|
77
78
|
end
|
78
79
|
|
79
|
-
|
80
|
+
private
|
81
|
+
|
82
|
+
def default_max_wait_time
|
83
|
+
if Capybara.respond_to?(:default_max_wait_time)
|
84
|
+
Capybara.default_max_wait_time
|
85
|
+
else
|
86
|
+
Capybara.default_wait_time
|
87
|
+
end
|
88
|
+
end
|
80
89
|
end
|
81
90
|
end
|
82
91
|
|
@@ -58,29 +58,6 @@ module AePageObjects
|
|
58
58
|
ResolvedRoute = Struct.new(:controller, :action)
|
59
59
|
end
|
60
60
|
|
61
|
-
class Rails23 < Base
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
def routes
|
66
|
-
@routes ||= begin
|
67
|
-
routes_class = Class.new do
|
68
|
-
include ActionController::UrlWriter
|
69
|
-
end
|
70
|
-
ActionController::Routing::Routes.install_helpers(routes_class)
|
71
|
-
routes_class.new
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def normalize_url(url)
|
76
|
-
url
|
77
|
-
end
|
78
|
-
|
79
|
-
def router
|
80
|
-
ActionController::Routing::Routes
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
61
|
class Rails3 < Base
|
85
62
|
|
86
63
|
private
|
@@ -155,9 +132,7 @@ module AePageObjects
|
|
155
132
|
|
156
133
|
def recognizer
|
157
134
|
@recognizer ||= begin
|
158
|
-
if ::Rails.version =~ /\
|
159
|
-
Recognizer::Rails23.new
|
160
|
-
elsif ::Rails.version =~ /\A3\.[01]/
|
135
|
+
if ::Rails.version =~ /\A3\.[01]/
|
161
136
|
Recognizer::Rails3.new
|
162
137
|
elsif ::Rails.version =~ /\A3\.2/
|
163
138
|
Recognizer::Rails32.new
|
@@ -33,11 +33,6 @@ module AePageObjects
|
|
33
33
|
false
|
34
34
|
end
|
35
35
|
|
36
|
-
def not_visible?
|
37
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Element#not_visible? is deprecated and will be removed in version 2.0.0. Use AePageObjects::Element#hidden? instead."
|
38
|
-
hidden?
|
39
|
-
end
|
40
|
-
|
41
36
|
def present?
|
42
37
|
wait_until_present
|
43
38
|
true
|
@@ -52,11 +47,6 @@ module AePageObjects
|
|
52
47
|
false
|
53
48
|
end
|
54
49
|
|
55
|
-
def not_present?
|
56
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Element#not_present? is deprecated and will be removed in version 2.0.0. Use AePageObjects::Element#absent? instead."
|
57
|
-
absent?
|
58
|
-
end
|
59
|
-
|
60
50
|
def presence
|
61
51
|
implicit_element
|
62
52
|
rescue LoadingElementFailed
|
@@ -90,11 +80,6 @@ module AePageObjects
|
|
90
80
|
raise ElementNotPresent, "element_class: #{@element_class}, options: #{@options.inspect}"
|
91
81
|
end
|
92
82
|
|
93
|
-
def wait_for_presence(timeout = nil)
|
94
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Element#wait_for_presence is deprecated and will be removed in version 2.0.0. Use AePageObjects::Element#wait_until_present instead."
|
95
|
-
wait_until_present(timeout)
|
96
|
-
end
|
97
|
-
|
98
83
|
def wait_until_absent(timeout = nil)
|
99
84
|
with_reloaded_element(timeout) do
|
100
85
|
@loaded_element.nil?
|
@@ -104,11 +89,6 @@ module AePageObjects
|
|
104
89
|
raise ElementNotAbsent, "element_class: #{@element_class}, options: #{@options.inspect}"
|
105
90
|
end
|
106
91
|
|
107
|
-
def wait_for_absence(timeout = nil)
|
108
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Element#wait_for_absence is deprecated and will be removed in version 2.0.0. Use AePageObjects::Element#wait_until_absent instead."
|
109
|
-
wait_until_absent(timeout)
|
110
|
-
end
|
111
|
-
|
112
92
|
def is_a?(type)
|
113
93
|
type == @element_class || type == ElementProxy
|
114
94
|
end
|
@@ -65,23 +65,19 @@ module AePageObjects
|
|
65
65
|
def item_xpath
|
66
66
|
@item_xpath ||= begin
|
67
67
|
evaled_locator = eval_locator(@item_locator)
|
68
|
+
|
69
|
+
query_args = evaled_locator + [{:exact => true}]
|
70
|
+
query = Capybara::Query.new(*query_args)
|
68
71
|
|
69
|
-
|
70
|
-
Capybara::Selector.normalize(*evaled_locator).xpaths.first
|
71
|
-
else
|
72
|
-
query_args = evaled_locator + [{:exact => true}]
|
73
|
-
query = Capybara::Query.new(*query_args)
|
72
|
+
result = query.xpath
|
74
73
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
if query.selector.format == :css
|
80
|
-
result = XPath.css(query.xpath).to_xpath
|
81
|
-
end
|
82
|
-
|
83
|
-
result
|
74
|
+
# if it's CSS, we need to run it through XPath as Capybara::Query#xpath only
|
75
|
+
# works when the selector is xpath. Lame.
|
76
|
+
if query.selector.format == :css
|
77
|
+
result = XPath.css(query.xpath).to_xpath
|
84
78
|
end
|
79
|
+
|
80
|
+
result
|
85
81
|
end
|
86
82
|
end
|
87
83
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ae_page_objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Donnie Tognazzini
|
@@ -14,22 +14,16 @@ dependencies:
|
|
14
14
|
name: capybara
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '2.8'
|
19
|
+
version: '2.1'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.1'
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: '2.
|
26
|
+
version: '2.1'
|
33
27
|
description: Capybara Page Objects pattern
|
34
28
|
email:
|
35
29
|
- engineering@appfolio.com
|
@@ -41,7 +35,6 @@ files:
|
|
41
35
|
- lib/ae_page_objects/core/application_router.rb
|
42
36
|
- lib/ae_page_objects/core/basic_router.rb
|
43
37
|
- lib/ae_page_objects/core/dsl.rb
|
44
|
-
- lib/ae_page_objects/core/rake_router.rb
|
45
38
|
- lib/ae_page_objects/core/site.rb
|
46
39
|
- lib/ae_page_objects/core/universe.rb
|
47
40
|
- lib/ae_page_objects/core_ext/module.rb
|
@@ -70,9 +63,7 @@ files:
|
|
70
63
|
- lib/ae_page_objects/util/internal_helpers.rb
|
71
64
|
- lib/ae_page_objects/util/page_polling.rb
|
72
65
|
- lib/ae_page_objects/util/singleton.rb
|
73
|
-
- lib/ae_page_objects/util/waiter.rb
|
74
66
|
- lib/ae_page_objects/version.rb
|
75
|
-
- lib/ae_page_objects/window.rb
|
76
67
|
homepage: http://github.com/appfolio/ae_page_objects
|
77
68
|
licenses:
|
78
69
|
- MIT
|
@@ -85,7 +76,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
76
|
requirements:
|
86
77
|
- - ">="
|
87
78
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
79
|
+
version: 1.9.3
|
89
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
81
|
requirements:
|
91
82
|
- - ">="
|
@@ -1,152 +0,0 @@
|
|
1
|
-
module AePageObjects
|
2
|
-
class RakeRouter < BasicRouter
|
3
|
-
|
4
|
-
attr_reader :routes
|
5
|
-
|
6
|
-
def initialize(rake_routes, mounted_prefix = '')
|
7
|
-
warn "[DEPRECATION WARNING]: AePageObjects::RakeRouter is deprecated and will be removed in version 2.0.0."
|
8
|
-
|
9
|
-
@mounted_prefix = mounted_prefix || ""
|
10
|
-
@routes = {}
|
11
|
-
route_line_regex = /(\w+)(?:\s[A-Z]+)?\s+(\/.*)\(.:format\).*$/
|
12
|
-
|
13
|
-
rake_routes.split("\n").each do |line|
|
14
|
-
line = line.strip
|
15
|
-
matches = route_line_regex.match(line)
|
16
|
-
if matches
|
17
|
-
@routes[matches[1].to_sym] = Route.new(matches[2], @mounted_prefix)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def path_recognizes_url?(path, url)
|
23
|
-
if path.is_a?(Symbol)
|
24
|
-
route = @routes[path]
|
25
|
-
route && route.matches?(url)
|
26
|
-
else
|
27
|
-
super
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def generate_path(named_route, *args)
|
32
|
-
if named_route.is_a?(String)
|
33
|
-
return Path.new(@mounted_prefix + named_route)
|
34
|
-
end
|
35
|
-
|
36
|
-
if route = @routes[named_route]
|
37
|
-
options = args.last.is_a?(Hash) ? args.pop : {}
|
38
|
-
route.generate_path(options)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
class Path < String
|
45
|
-
attr_reader :params, :regex
|
46
|
-
|
47
|
-
def initialize(value)
|
48
|
-
super(value.gsub(/(\/)+/, '/').sub(/\(\.\:format\)$/, ''))
|
49
|
-
|
50
|
-
@params = parse_params
|
51
|
-
@regex = generate_regex
|
52
|
-
end
|
53
|
-
|
54
|
-
def generate(param_values)
|
55
|
-
param_values = HashSymbolizer.new(param_values).symbolize_keys
|
56
|
-
@params.values.inject(self) do |path, param|
|
57
|
-
param.substitute(path, param_values)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
def parse_params
|
63
|
-
# overwrite the required status with the optional
|
64
|
-
{}.merge(required_params).merge(optional_params)
|
65
|
-
end
|
66
|
-
|
67
|
-
def find_params(using_regex)
|
68
|
-
scan(using_regex).flatten.map(&:to_sym)
|
69
|
-
end
|
70
|
-
|
71
|
-
def optional_params
|
72
|
-
{}.tap do |optional_params|
|
73
|
-
find_params(/\(\/\:(\w+)\)/).each do |param_name|
|
74
|
-
optional_params[param_name] = Param.new(param_name, true)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def required_params
|
80
|
-
{}.tap do |required_params|
|
81
|
-
find_params(/\:(\w+)/).each do |param_name|
|
82
|
-
required_params[param_name] = Param.new(param_name, false)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def generate_regex
|
88
|
-
regex_spec = @params.values.inject(self) do |regex_spec, param|
|
89
|
-
param.replace_param_in_url(regex_spec)
|
90
|
-
end
|
91
|
-
Regexp.new regex_spec
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
class Param < Struct.new(:name, :optional)
|
96
|
-
include Comparable
|
97
|
-
|
98
|
-
def optional?
|
99
|
-
optional
|
100
|
-
end
|
101
|
-
|
102
|
-
def <=>(other)
|
103
|
-
name.to_s <=> other.name.to_s
|
104
|
-
end
|
105
|
-
|
106
|
-
def eql?(other)
|
107
|
-
name == other.name
|
108
|
-
end
|
109
|
-
|
110
|
-
def hash
|
111
|
-
name.hash
|
112
|
-
end
|
113
|
-
|
114
|
-
def replace_param_in_url(url)
|
115
|
-
if optional?
|
116
|
-
url.gsub("(/:#{name})", '(\/.+)?')
|
117
|
-
else
|
118
|
-
url.gsub(":#{name}", '(.+)')
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def substitute(url, values)
|
123
|
-
if optional?
|
124
|
-
if values[name]
|
125
|
-
url.sub("(/:#{name})", "/#{values[name]}")
|
126
|
-
else
|
127
|
-
url.sub("(/:#{name})", '')
|
128
|
-
end
|
129
|
-
else
|
130
|
-
raise ArgumentError, "Missing required parameter '#{name}' for '#{url}' in #{values.inspect}" unless values.key? name
|
131
|
-
url.sub(":#{name}", values[name])
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
class Route
|
137
|
-
def initialize(spec, mounted_prefix)
|
138
|
-
@path = Path.new(mounted_prefix + spec)
|
139
|
-
@path.freeze
|
140
|
-
end
|
141
|
-
|
142
|
-
def matches?(url)
|
143
|
-
url =~ @path.regex
|
144
|
-
end
|
145
|
-
|
146
|
-
def generate_path(options)
|
147
|
-
options = HashSymbolizer.new(options).symbolize_keys
|
148
|
-
@path.generate(options)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'ae_page_objects/util/page_polling'
|
2
|
-
|
3
|
-
module AePageObjects
|
4
|
-
module Waiter
|
5
|
-
class << self
|
6
|
-
include AePageObjects::PagePolling
|
7
|
-
|
8
|
-
def wait_until(timeout = nil, &block)
|
9
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Waiter.wait_until is deprecated and will be removed in version 2.0.0. Use AePageObjects.wait_until instead."
|
10
|
-
wait_until_return_false(timeout, &block)
|
11
|
-
end
|
12
|
-
|
13
|
-
def wait_for(timeout = nil, &block)
|
14
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Waiter.wait_for is deprecated and will be removed in version 2.0.0. Use AePageObjects.wait_until instead."
|
15
|
-
wait_until_return_false(timeout, &block)
|
16
|
-
end
|
17
|
-
|
18
|
-
def wait_until!(timeout = nil, &block)
|
19
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Waiter.wait_until! is deprecated and will be removed in version 2.0.0. Use AePageObjects.wait_until instead."
|
20
|
-
poll_until(timeout, &block)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def wait_until_return_false(timeout, &block)
|
26
|
-
poll_until(timeout, &block)
|
27
|
-
rescue WaitTimeoutError
|
28
|
-
false
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
unless AePageObjects.respond_to?(:browser)
|
2
|
-
raise "Deprecation warnings out of date."
|
3
|
-
end
|
4
|
-
|
5
|
-
module AePageObjects
|
6
|
-
class Window
|
7
|
-
class << self
|
8
|
-
def all
|
9
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Window.all is deprecated. Use AePageObjects.browser.windows()"
|
10
|
-
AePageObjects.browser.windows
|
11
|
-
end
|
12
|
-
|
13
|
-
def close_all
|
14
|
-
warn "[DEPRECATION WARNING]: AePageObjects::Window.close_all is deprecated. Use AePageObjects.browser.windows.close_all()"
|
15
|
-
all.close_all
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|