site_prism 3.1 → 3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -0
- data/lib/site_prism/dsl.rb +16 -10
- data/lib/site_prism/error.rb +8 -0
- data/lib/site_prism/page.rb +16 -9
- data/lib/site_prism/version.rb +1 -1
- data/lib/site_prism/waiter.rb +23 -7
- metadata +35 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bb0a772ccdabf209eba492206b0c664418fa46f1b2bdb2c8d08cbcf384b5522
|
4
|
+
data.tar.gz: be9c7ca220f2a20122a3bfd955fa617acda1ecb3d6aedac9472300f4c17ff014
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d21079c647c16bcb896374557448fc9c514ce8d3d16379e77f64be741b2ef76f7c2438ff9fd3d0f5bdd96a3678d92b40e162d3847a04647de1ed553b7a786b2f
|
7
|
+
data.tar.gz: bf7ea9e4ff98d6ae92427a98b21a35bd519638080c5b3c55f9565e163710b748c11152374293ee783d32a1f1ef599bbac5be99a56f696d144fb1f53d0d7836d4
|
data/README.md
CHANGED
@@ -1345,6 +1345,18 @@ Load validations may be defined on `SitePrism::Page` and `SitePrism::Section`
|
|
1345
1345
|
classes (herein referred to as `Loadables`) and are evaluated against an
|
1346
1346
|
instance of the class when created.
|
1347
1347
|
|
1348
|
+
### Skipping load Validations
|
1349
|
+
|
1350
|
+
Defined load validations can be skipped for one `load` call by
|
1351
|
+
passing in `with_validations: false`.
|
1352
|
+
|
1353
|
+
```ruby
|
1354
|
+
it 'loads the page without validations' do
|
1355
|
+
some_page.load(with_validations: false)
|
1356
|
+
some_page.loaded? #=> true unless something has gone wrong
|
1357
|
+
end
|
1358
|
+
```
|
1359
|
+
|
1348
1360
|
### Load Validation Inheritance and Execution Order
|
1349
1361
|
|
1350
1362
|
Any number of load validations may be defined on a Loadable and they are
|
data/lib/site_prism/dsl.rb
CHANGED
@@ -122,14 +122,11 @@ module SitePrism
|
|
122
122
|
def iframe(name, klass, *args)
|
123
123
|
element_find_args = deduce_iframe_element_find_args(args)
|
124
124
|
scope_find_args = deduce_iframe_scope_find_args(args)
|
125
|
-
|
126
125
|
build(:iframe, name, *element_find_args) do
|
127
126
|
define_method(name) do |&block|
|
128
127
|
raise MissingBlockError unless block
|
129
128
|
|
130
|
-
within_frame(*scope_find_args)
|
131
|
-
block.call(klass.new)
|
132
|
-
end
|
129
|
+
within_frame(*scope_find_args) { block.call(klass.new) }
|
133
130
|
end
|
134
131
|
end
|
135
132
|
end
|
@@ -157,6 +154,7 @@ module SitePrism
|
|
157
154
|
def add_helper_methods(name, *find_args)
|
158
155
|
create_existence_checker(name, *find_args)
|
159
156
|
create_nonexistence_checker(name, *find_args)
|
157
|
+
create_rspec_existence_matchers(name) if defined?(RSpec)
|
160
158
|
create_visibility_waiter(name, *find_args)
|
161
159
|
create_invisibility_waiter(name, *find_args)
|
162
160
|
end
|
@@ -169,6 +167,18 @@ module SitePrism
|
|
169
167
|
end
|
170
168
|
end
|
171
169
|
|
170
|
+
def create_rspec_existence_matchers(element_name)
|
171
|
+
matcher = "has_#{element_name}?"
|
172
|
+
negated_matcher = "has_no_#{element_name}?"
|
173
|
+
|
174
|
+
RSpec::Matchers.define "have_#{element_name}" do |*args|
|
175
|
+
match { |actual| actual.public_send(matcher, *args) }
|
176
|
+
match_when_negated do |actual|
|
177
|
+
actual.public_send(negated_matcher, *args)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
172
182
|
def create_existence_checker(element_name, *find_args)
|
173
183
|
method_name = "has_#{element_name}?"
|
174
184
|
create_helper_method(method_name, *find_args) do
|
@@ -215,10 +225,7 @@ module SitePrism
|
|
215
225
|
|
216
226
|
def create_error_method(name)
|
217
227
|
SitePrism.logger.error("#{name} has come from an item with 0 locators.")
|
218
|
-
|
219
|
-
define_method(name) do
|
220
|
-
raise SitePrism::InvalidElementError
|
221
|
-
end
|
228
|
+
define_method(name) { raise SitePrism::InvalidElementError }
|
222
229
|
end
|
223
230
|
|
224
231
|
def deduce_iframe_scope_find_args(args)
|
@@ -242,8 +249,7 @@ module SitePrism
|
|
242
249
|
def warn_on_invalid_selector_input(args)
|
243
250
|
return unless looks_like_xpath?(args[0])
|
244
251
|
|
245
|
-
|
246
|
-
SitePrism.logger.warn(msg)
|
252
|
+
SitePrism.logger.warn('The arguments passed in look like xpath. Check your locators.')
|
247
253
|
SitePrism.logger.debug("Default locator: #{Capybara.default_selector}")
|
248
254
|
end
|
249
255
|
|
data/lib/site_prism/error.rb
CHANGED
@@ -25,6 +25,14 @@ module SitePrism
|
|
25
25
|
# Formerly known as `NoSelectorForElement`
|
26
26
|
class InvalidElementError < SitePrismError; end
|
27
27
|
|
28
|
+
# A tool like Timecop is being used to "freeze time" by overriding Time.now
|
29
|
+
# and similar methods. In this case, our waiter functions won't work, because
|
30
|
+
# Time.now does not change.
|
31
|
+
# If you encounter this issue, check that you are not doing Timecop.freeze without
|
32
|
+
# an accompanying Timecop.return.
|
33
|
+
# Also check out Timecop.safe_mode https://github.com/travisjeffery/timecop#timecopsafe_mode
|
34
|
+
class FrozenInTimeError < SitePrismError; end
|
35
|
+
|
28
36
|
# The condition that was being evaluated inside the block did not evaluate
|
29
37
|
# to true within the time limit
|
30
38
|
# Formerly known as `TimeoutException`
|
data/lib/site_prism/page.rb
CHANGED
@@ -64,18 +64,20 @@ module SitePrism
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def displayed?(*args)
|
67
|
-
|
68
|
-
|
67
|
+
wait_until_displayed(*args)
|
68
|
+
rescue SitePrism::TimeoutError
|
69
|
+
false
|
70
|
+
end
|
71
|
+
|
72
|
+
def wait_until_displayed(*args)
|
69
73
|
raise SitePrism::NoUrlMatcherForPageError unless url_matcher
|
70
74
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
false
|
75
|
-
end
|
75
|
+
expected_mappings = args.last.is_a?(::Hash) ? args.pop : {}
|
76
|
+
seconds = args&.first || wait_time
|
77
|
+
Waiter.wait_until_true(seconds) { url_matches?(expected_mappings) }
|
76
78
|
end
|
77
79
|
|
78
|
-
def url_matches(seconds =
|
80
|
+
def url_matches(seconds = wait_time)
|
79
81
|
return unless displayed?(seconds)
|
80
82
|
|
81
83
|
if url_matcher.is_a?(Regexp)
|
@@ -153,11 +155,16 @@ module SitePrism
|
|
153
155
|
end
|
154
156
|
|
155
157
|
def load_html_website(html, &block)
|
158
|
+
with_validations = html.delete(:with_validations) { true }
|
156
159
|
expanded_url = url(html)
|
157
160
|
raise SitePrism::NoUrlForPageError unless expanded_url
|
158
161
|
|
159
162
|
visit expanded_url
|
160
|
-
|
163
|
+
if with_validations
|
164
|
+
when_loaded(&block)
|
165
|
+
elsif block_given?
|
166
|
+
yield self
|
167
|
+
end
|
161
168
|
end
|
162
169
|
end
|
163
170
|
# rubocop:enable Metrics/ClassLength
|
data/lib/site_prism/version.rb
CHANGED
data/lib/site_prism/waiter.rb
CHANGED
@@ -2,17 +2,33 @@
|
|
2
2
|
|
3
3
|
module SitePrism
|
4
4
|
class Waiter
|
5
|
-
|
6
|
-
|
5
|
+
class << self
|
6
|
+
def wait_until_true(wait_time = Capybara.default_max_wait_time)
|
7
|
+
start_time = Time.now
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
9
|
+
loop do
|
10
|
+
return true if yield
|
11
|
+
break if Time.now - start_time > wait_time
|
11
12
|
|
12
|
-
|
13
|
+
sleep(0.05)
|
14
|
+
|
15
|
+
check_for_time_stopped!(start_time)
|
16
|
+
end
|
17
|
+
|
18
|
+
raise SitePrism::TimeoutError, "Timed out after #{wait_time}s."
|
13
19
|
end
|
14
20
|
|
15
|
-
|
21
|
+
private
|
22
|
+
|
23
|
+
def check_for_time_stopped!(start_time)
|
24
|
+
return unless start_time == Time.now
|
25
|
+
|
26
|
+
raise(
|
27
|
+
SitePrism::FrozenInTimeError,
|
28
|
+
'Time appears to be frozen. For more info, see ' \
|
29
|
+
'https://github.com/natritmeyer/site_prism/blob/master/lib/site_prism/error.rb'
|
30
|
+
)
|
31
|
+
end
|
16
32
|
end
|
17
33
|
end
|
18
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: site_prism
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '3.
|
4
|
+
version: '3.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nat Ritmeyer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
@@ -101,14 +101,28 @@ dependencies:
|
|
101
101
|
requirements:
|
102
102
|
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: 0.
|
104
|
+
version: 0.67.0
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
109
|
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: 0.
|
111
|
+
version: 0.67.0
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: rubocop-performance
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 1.0.0
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.0.0
|
112
126
|
- !ruby/object:Gem::Dependency
|
113
127
|
name: selenium-webdriver
|
114
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,8 +151,23 @@ dependencies:
|
|
137
151
|
- - "~>"
|
138
152
|
- !ruby/object:Gem::Version
|
139
153
|
version: '0.16'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: webdrivers
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - "~>"
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: 3.9.1
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - "~>"
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 3.9.1
|
140
168
|
description: |-
|
141
|
-
SitePrism gives you a simple,
|
169
|
+
SitePrism gives you a simple,
|
170
|
+
clean and semantic DSL for describing your site.
|
142
171
|
SitePrism implements the Page Object Model pattern on top of Capybara.
|
143
172
|
email:
|
144
173
|
- nat@natontesting.com
|
@@ -165,7 +194,7 @@ licenses:
|
|
165
194
|
- BSD-3-Clause
|
166
195
|
metadata:
|
167
196
|
bug_tracker_uri: https://github.com/natritmeyer/site_prism/issues
|
168
|
-
changelog_uri: https://github.com/natritmeyer/site_prism/blob/master/
|
197
|
+
changelog_uri: https://github.com/natritmeyer/site_prism/blob/master/CHANGELOG.md
|
169
198
|
source_code_uri: https://github.com/natritmeyer/site_prism
|
170
199
|
post_install_message:
|
171
200
|
rdoc_options: []
|