unobtainium-multifind 0.1.0 → 0.2.0
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/Gemfile.lock +1 -1
- data/lib/unobtainium-multifind/multifind.rb +54 -0
- data/lib/unobtainium-multifind/version.rb +1 -1
- data/spec/data/foo.html +2 -1
- data/spec/module_spec.rb +40 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 392fa2fb38d4cec4325a05a5b69243a5f9f4be07
|
4
|
+
data.tar.gz: c56559898399e3d17d8642d6e819c8983aa5edbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1774529bf9115b1ab19348ba2e34acf6110d841f90a2aea769f40ade372cceddc7224a120d06048b25255f7ce9ec731a058735ec29fc79b8c1d09b025120fa63
|
7
|
+
data.tar.gz: ec8e6dff393173d2a35eb9547b79de88b37cda555a74c5df10ea8557b598f69ae7ac8de12b544b3c37f9b10ecda6f21091cacb27c783d8f8c2f28a28ccc0ea6d
|
data/Gemfile.lock
CHANGED
@@ -32,6 +32,10 @@ module Unobtainium
|
|
32
32
|
# If :last is specified, the last non-error result is
|
33
33
|
# returned.
|
34
34
|
find: :all,
|
35
|
+
# Defaults to only finding :displayed? elements. You can use any method
|
36
|
+
# that Selenium::WebDriver::Element responds to, or :exists? if you only
|
37
|
+
# care whether the element exists.
|
38
|
+
check_element: :displayed?,
|
35
39
|
}.freeze
|
36
40
|
|
37
41
|
class << self
|
@@ -48,6 +52,13 @@ module Unobtainium
|
|
48
52
|
attr_accessor :multifind_options
|
49
53
|
@multifind_options = DEFAULT_OPTIONS
|
50
54
|
|
55
|
+
##
|
56
|
+
# Find multiple elements. Each argument is a Hash of selector options
|
57
|
+
# that are passed to #find_element. If one argument contains keys from
|
58
|
+
# the DEFAULT_OPTIONS Hash, it is instead treated as an options Hash for
|
59
|
+
# the #multifind method.
|
60
|
+
# @return Array of found elements or nil entries if no matching element
|
61
|
+
# was found.
|
51
62
|
def multifind(*args)
|
52
63
|
# Parse options
|
53
64
|
options, selectors = multifind_parse_options(*args)
|
@@ -118,6 +129,15 @@ module Unobtainium
|
|
118
129
|
":last, but is: #{options[:find]}"
|
119
130
|
end
|
120
131
|
|
132
|
+
# Ensure that 'check_element' contains only valid options.
|
133
|
+
elem_klass = ::Selenium::WebDriver::Element
|
134
|
+
if options[:check_element] != :exists? and
|
135
|
+
not elem_klass.instance_methods.include?(options[:check_element])
|
136
|
+
raise ArgumentError, ":check_element must either be :exists? or "\
|
137
|
+
"a boolean method that ::Selenium::WebDriver::Element responds to, "\
|
138
|
+
"but got: #{options[:check_element]}"
|
139
|
+
end
|
140
|
+
|
121
141
|
return options, selectors
|
122
142
|
end
|
123
143
|
|
@@ -125,6 +145,40 @@ module Unobtainium
|
|
125
145
|
# Filters results from multifind; this largely means honouring the
|
126
146
|
# :find option.
|
127
147
|
def multifind_filter_results(options, results)
|
148
|
+
results = multifind_collapse_results(options, results)
|
149
|
+
|
150
|
+
# If we're only checking for existence, we're done here.
|
151
|
+
if options[:check_element] == :exists?
|
152
|
+
return results
|
153
|
+
end
|
154
|
+
|
155
|
+
# Filter all results according to the :check_element option
|
156
|
+
filtered = []
|
157
|
+
results.each do |result|
|
158
|
+
if result.nil?
|
159
|
+
filtered << result
|
160
|
+
next
|
161
|
+
end
|
162
|
+
if result.is_a?(::Selenium::WebDriver::Error::NoSuchElementError)
|
163
|
+
filtered << result
|
164
|
+
next
|
165
|
+
end
|
166
|
+
|
167
|
+
# Run check_element
|
168
|
+
if result.send(options[:check_element])
|
169
|
+
filtered << result
|
170
|
+
next
|
171
|
+
end
|
172
|
+
|
173
|
+
filtered << nil
|
174
|
+
end
|
175
|
+
|
176
|
+
return filtered
|
177
|
+
end
|
178
|
+
|
179
|
+
##
|
180
|
+
# Collapses results to only return what's specified by :find.
|
181
|
+
def multifind_collapse_results(options, results)
|
128
182
|
# That was easy!
|
129
183
|
if options[:find] == :all
|
130
184
|
return results
|
data/spec/data/foo.html
CHANGED
data/spec/module_spec.rb
CHANGED
@@ -148,6 +148,29 @@ describe 'Unobtainium::MultiFind::DriverModule' do
|
|
148
148
|
expect(elem).to be_empty
|
149
149
|
end
|
150
150
|
|
151
|
+
it "does not find hidden elements by default" do
|
152
|
+
drv = @tester.driver(DRIVER)
|
153
|
+
drv.navigate.to(TEST_URL)
|
154
|
+
|
155
|
+
elem = drv.find(xpath: '//foo/hidden')
|
156
|
+
expect(elem).not_to be_nil
|
157
|
+
expect(elem).not_to be_empty
|
158
|
+
expect(elem[0]).to be_nil
|
159
|
+
end
|
160
|
+
|
161
|
+
it "finds hidden element with :exists?" do
|
162
|
+
drv = @tester.driver(DRIVER)
|
163
|
+
drv.navigate.to(TEST_URL)
|
164
|
+
|
165
|
+
# rubocop:disable Style/BracesAroundHashParameters
|
166
|
+
elem = drv.find({ xpath: '//hidden' },
|
167
|
+
{ check_element: :exists? })
|
168
|
+
# rubocop:enable Style/BracesAroundHashParameters
|
169
|
+
expect(elem).not_to be_nil
|
170
|
+
expect(elem).not_to be_empty
|
171
|
+
expect(elem[0]).not_to be_nil
|
172
|
+
end
|
173
|
+
|
151
174
|
it "passes non-hash arguments without touching them" do
|
152
175
|
drv = @tester.driver(DRIVER)
|
153
176
|
drv.navigate.to(TEST_URL)
|
@@ -212,5 +235,22 @@ describe 'Unobtainium::MultiFind::DriverModule' do
|
|
212
235
|
drv.find(xpath: '//foo')
|
213
236
|
end.to raise_error
|
214
237
|
end
|
238
|
+
|
239
|
+
it "validates :check_element" do
|
240
|
+
drv = @tester.driver(DRIVER)
|
241
|
+
drv.navigate.to(TEST_URL)
|
242
|
+
|
243
|
+
# Good option
|
244
|
+
drv.multifind_options = { check_element: :exists? }
|
245
|
+
expect do
|
246
|
+
drv.find(xpath: '//foo')
|
247
|
+
end.not_to raise_error
|
248
|
+
|
249
|
+
# Bad option
|
250
|
+
drv.multifind_options = { check_element: :foobar }
|
251
|
+
expect do
|
252
|
+
drv.find(xpath: '//foo')
|
253
|
+
end.to raise_error
|
254
|
+
end
|
215
255
|
end
|
216
256
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unobtainium-multifind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Finkhaeuser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|