eyes_selenium 3.2.2 → 3.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/lib/applitools/selenium/element.rb +9 -0
- data/lib/applitools/selenium/element_position_provider.rb +2 -0
- data/lib/applitools/selenium/eyes.rb +159 -2
- data/lib/applitools/selenium/eyes_target_locator.rb +11 -2
- data/lib/applitools/selenium/move_to_region_visibility_strategy.rb +1 -0
- data/lib/applitools/selenium/region_provider.rb +10 -0
- data/lib/applitools/selenium/target.rb +97 -0
- data/lib/applitools/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e79fbaad2e65435471ba70672dd81c0765cb2e67
|
4
|
+
data.tar.gz: 030f097040e4f3ab96bf0cb00313724f1f22c3d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8ac42ec51804f6a0a4624729d97ffa153ea6443d53ed7016ad6bffb964fba1a4a9cfb119fe8e200cf9db9170eda199e5ee83238ed9cb285db9e2c29a0a8ea41
|
7
|
+
data.tar.gz: 672c0e3a7af3c8207ed8018ca0c9ad3a6909f82398a4d10711fdc524039d0b3b386e5cf7c3a55890d1ee6aa3bf102e5e340eb4f22a80264c02f9245d195a994d
|
@@ -175,6 +175,15 @@ module Applitools::Selenium
|
|
175
175
|
driver.execute_script format(JS_SCROLL_TO_FORMATTED_STR, location.x, location.y), self
|
176
176
|
end
|
177
177
|
|
178
|
+
def to_hash
|
179
|
+
{
|
180
|
+
left: location.x.to_i,
|
181
|
+
top: location.y.to_i,
|
182
|
+
width: size.width.to_i,
|
183
|
+
height: size.height.to_i
|
184
|
+
}
|
185
|
+
end
|
186
|
+
|
178
187
|
private
|
179
188
|
|
180
189
|
attr_reader :driver
|
@@ -217,6 +217,160 @@ module Applitools::Selenium
|
|
217
217
|
Applitools::Utils::EyesSeleniumUtils.extract_viewport_size(driver)
|
218
218
|
end
|
219
219
|
|
220
|
+
def check(name, target)
|
221
|
+
Applitools::ArgumentGuard.is_a? target, 'target', Applitools::Selenium::Target
|
222
|
+
original_overflow = nil
|
223
|
+
original_position_provider = position_provider
|
224
|
+
|
225
|
+
eyes_element = nil
|
226
|
+
|
227
|
+
self.eyes_screenshot_factory = lambda do |image|
|
228
|
+
Applitools::Selenium::EyesWebDriverScreenshot.new(
|
229
|
+
image, driver: driver, force_offset: position_provider.force_offset
|
230
|
+
)
|
231
|
+
end
|
232
|
+
|
233
|
+
check_in_frame target_frames: target.frames do
|
234
|
+
begin
|
235
|
+
eyes_element = target.region_to_check.call(driver)
|
236
|
+
|
237
|
+
region_visibility_strategy.move_to_region original_position_provider,
|
238
|
+
Applitools::Location.new(eyes_element.location.x.to_i, eyes_element.location.y.to_i)
|
239
|
+
|
240
|
+
check_window = false
|
241
|
+
if (!target.frames.empty?) && eyes_element.is_a?(Applitools::Region)
|
242
|
+
#check_current_frame
|
243
|
+
region_provider = region_provider_for_frame
|
244
|
+
|
245
|
+
elsif eyes_element.is_a? Applitools::Selenium::Element
|
246
|
+
#check_element
|
247
|
+
region_provider = Applitools::Selenium::RegionProvider.new(
|
248
|
+
region_for_element(eyes_element),
|
249
|
+
target.coordinate_type
|
250
|
+
)
|
251
|
+
else
|
252
|
+
#check_window
|
253
|
+
region_provider = Applitools::Selenium::RegionProvider.new(
|
254
|
+
region_for_element(eyes_element),
|
255
|
+
target.coordinate_type
|
256
|
+
)
|
257
|
+
check_window = true
|
258
|
+
end
|
259
|
+
|
260
|
+
if target.options[:stitch_content]
|
261
|
+
check_window ? self.force_full_page_screenshot = true : self.check_frame_or_element = true
|
262
|
+
if eyes_element.is_a? Applitools::Selenium::Element
|
263
|
+
self.position_provider = Applitools::Selenium::ElementPositionProvider.new driver, eyes_element
|
264
|
+
|
265
|
+
original_overflow = eyes_element.overflow
|
266
|
+
eyes_element.overflow = 'hidden'
|
267
|
+
end
|
268
|
+
|
269
|
+
self.region_to_check = region_provider
|
270
|
+
|
271
|
+
region_provider = Object.new.tap do |prov|
|
272
|
+
prov.instance_eval do
|
273
|
+
define_singleton_method :region do
|
274
|
+
Applitools::Region::EMPTY
|
275
|
+
end
|
276
|
+
|
277
|
+
define_singleton_method :coordinate_type do
|
278
|
+
nil
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
check_window_base(
|
285
|
+
region_provider, name, false, target.options[:timeout] || USE_DEFAULT_MATCH_TIMEOUT,
|
286
|
+
ignore: target.ignored_regions.map {|i| i.call(driver)},
|
287
|
+
trim: target.options[:trim]
|
288
|
+
)
|
289
|
+
ensure
|
290
|
+
eyes_element.overflow = original_overflow unless original_overflow.nil?
|
291
|
+
self.check_frame_or_element = false
|
292
|
+
self.force_full_page_screenshot = false
|
293
|
+
self.position_provider = original_position_provider
|
294
|
+
self.region_to_check = nil
|
295
|
+
region_visibility_strategy.return_to_original_position position_provider
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def check_in_frame(options)
|
301
|
+
frames = options.delete :target_frames
|
302
|
+
|
303
|
+
Applitools::ArgumentGuard.is_a? options, 'options', Hash
|
304
|
+
Applitools::ArgumentGuard.is_a? frames, 'target_frames: []', Array
|
305
|
+
|
306
|
+
return yield if block_given? && frames.empty?
|
307
|
+
|
308
|
+
original_frame_chain = driver.frame_chain
|
309
|
+
logger.info 'Switching to target frame according to frames path...'
|
310
|
+
driver.switch_to.frames(frames_path: frames)
|
311
|
+
logger.info 'Done!'
|
312
|
+
|
313
|
+
yield if block_given?
|
314
|
+
|
315
|
+
|
316
|
+
logger.info 'Switching back into top level frame...'
|
317
|
+
driver.switch_to.default_content()
|
318
|
+
unless original_frame_chain
|
319
|
+
logger.info 'Switching back into original frame...'
|
320
|
+
driver.switch_to.frames frame_chain: original_frame_chain
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
def region_for_element(element)
|
325
|
+
return element if element.is_a? Applitools::Region
|
326
|
+
|
327
|
+
p = element.location
|
328
|
+
d = element.size
|
329
|
+
|
330
|
+
border_left_width = element.border_left_width
|
331
|
+
border_top_width = element.border_top_width
|
332
|
+
border_right_width = element.border_right_width
|
333
|
+
border_bottom_width = element.border_bottom_width
|
334
|
+
|
335
|
+
Applitools::Region.new(
|
336
|
+
p.x + border_left_width,
|
337
|
+
p.y + border_top_width,
|
338
|
+
d.width - border_left_width - border_right_width,
|
339
|
+
d.height - border_top_width - border_bottom_width
|
340
|
+
)
|
341
|
+
end
|
342
|
+
|
343
|
+
def region_provider_for_frame()
|
344
|
+
Object.new.tap do |provider|
|
345
|
+
current_frame_size = lambda do
|
346
|
+
frame_region = Applitools::Region.from_location_size(
|
347
|
+
Applitools::Location.new(0, 0), driver.frame_chain!.current_frame.size
|
348
|
+
)
|
349
|
+
begin
|
350
|
+
frame_region.intersect Applitools::Region.from_location_size(
|
351
|
+
Applitools::Location.new(0, 0),
|
352
|
+
Applitools::Utils::EyesSeleniumUtils.entire_page_size(driver)
|
353
|
+
)
|
354
|
+
frame_region
|
355
|
+
ensure
|
356
|
+
frame_region
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
provider.instance_eval do
|
361
|
+
define_singleton_method :region do
|
362
|
+
current_frame_size.call
|
363
|
+
end
|
364
|
+
define_singleton_method :coordinate_type do
|
365
|
+
Applitools::EyesScreenshot::COORDINATE_TYPES[:context_relative]
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
private :check_in_frame
|
372
|
+
private :region_for_element
|
373
|
+
|
220
374
|
# Takes a snapshot of the application under test and matches a region of
|
221
375
|
# a specific element with the expected region output.
|
222
376
|
# @param [Applitools::Selenium::Element] element Represents a region to check.
|
@@ -397,12 +551,15 @@ module Applitools::Selenium
|
|
397
551
|
options[:name_or_id] ||
|
398
552
|
options[:frame_element] ||
|
399
553
|
options[:frame_chain] ||
|
400
|
-
options[:frames_path]
|
554
|
+
options[:frames_path] ||
|
555
|
+
options[:target_frames]
|
401
556
|
raise Applitools::EyesIllegalArgument.new 'You must pass :index or :name_or_id or :frame_element option' /
|
402
557
|
'or :frame_chain option or :frames_path option'
|
403
558
|
end
|
404
559
|
|
405
|
-
if (needed_keys = (
|
560
|
+
if (needed_keys = (
|
561
|
+
options.keys & [:index, :name_or_id, :frame_element, :frame_chain, :frames_path, :target_frames])
|
562
|
+
).length == 1
|
406
563
|
frame_key = needed_keys.first
|
407
564
|
else
|
408
565
|
raise Applitools::EyesIllegalArgument.new 'You\'ve passed some extra keys!' /
|
@@ -145,7 +145,7 @@ module Applitools::Selenium
|
|
145
145
|
raise Applitools::EyesNoSuchFrame.new "No frame with name or id #{name_or_id} exists!" if frames.empty?
|
146
146
|
end
|
147
147
|
logger.info 'Done! Making preparations...'
|
148
|
-
on_will_switch.will_switch_to_frame(:frame, frames.first)
|
148
|
+
on_will_switch.will_switch_to_frame(:frame, frames.first)
|
149
149
|
logger.info 'Done! Switching to frame...'
|
150
150
|
__getobj__.frame frames.first
|
151
151
|
|
@@ -181,7 +181,16 @@ module Applitools::Selenium
|
|
181
181
|
logger.info 'EyesTargetLocator.frames(:frames_path => a_chain)'
|
182
182
|
frames_path.each do |frame_name_or_id|
|
183
183
|
logger.info 'Switching to frame...'
|
184
|
-
|
184
|
+
logger.info frame_name_or_id
|
185
|
+
case frame_name_or_id
|
186
|
+
when String
|
187
|
+
frame(name_or_id: frame_name_or_id)
|
188
|
+
when Applitools::Selenium::Element
|
189
|
+
frame(frame_element: frame_name_or_id.reference)
|
190
|
+
else
|
191
|
+
Applitools::ArgumentGuard.raise_argument_error Applitools::EyesNoSuchFrame.new frame_name_or_id
|
192
|
+
end
|
193
|
+
|
185
194
|
logger.info 'Done!'
|
186
195
|
end
|
187
196
|
logger.info 'Done switching into nested frames!'
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Applitools
|
2
|
+
module Selenium
|
3
|
+
class Target
|
4
|
+
class << self
|
5
|
+
def window
|
6
|
+
self.new()
|
7
|
+
end
|
8
|
+
|
9
|
+
def region(element)
|
10
|
+
self.new().region(element)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :element, :frames, :region_to_check, :coordinate_type, :options, :ignored_regions
|
15
|
+
|
16
|
+
def initialize()
|
17
|
+
self.frames = []
|
18
|
+
self.options = {}
|
19
|
+
reset_for_fullscreen
|
20
|
+
end
|
21
|
+
|
22
|
+
def ignore(*args)
|
23
|
+
if(args.first)
|
24
|
+
if args.first.is_a? Applitools::Selenium::Element
|
25
|
+
self.ignored_regions << proc do
|
26
|
+
args.first
|
27
|
+
end
|
28
|
+
else
|
29
|
+
self.ignored_regions << proc do |driver|
|
30
|
+
driver.find_element *args
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
reset_ignore
|
35
|
+
end
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def float(*args)
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def fully
|
44
|
+
options[:stitch_content] = true
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def timeout(value)
|
49
|
+
options[:timeout] = value
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def frame(element)
|
54
|
+
frames << element
|
55
|
+
reset_for_fullscreen
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
def region(*args)
|
60
|
+
if args.first.is_a? Applitools::Selenium::Element
|
61
|
+
self.region_to_check = proc do
|
62
|
+
args.first
|
63
|
+
end
|
64
|
+
else
|
65
|
+
self.region_to_check = proc do |driver|
|
66
|
+
driver.find_element *args
|
67
|
+
end
|
68
|
+
end
|
69
|
+
self.coordinate_type = Applitools::EyesScreenshot::COORDINATE_TYPES[:context_relative]
|
70
|
+
options[:timeout] = nil
|
71
|
+
reset_ignore
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def trim
|
76
|
+
options[:trim] = true
|
77
|
+
self
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def reset_for_fullscreen
|
83
|
+
self.coordinate_type = nil
|
84
|
+
self.region_to_check = proc { Applitools::Region::EMPTY }
|
85
|
+
reset_ignore
|
86
|
+
options[:stitch_content] = false
|
87
|
+
options[:timeout] = nil
|
88
|
+
options[:trim] = false
|
89
|
+
end
|
90
|
+
|
91
|
+
def reset_ignore
|
92
|
+
self.ignored_regions = []
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
data/lib/applitools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eyes_selenium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Applitools Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eyes_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
19
|
+
version: 3.3.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.
|
26
|
+
version: 3.3.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: selenium-webdriver
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,9 +94,11 @@ files:
|
|
94
94
|
- lib/applitools/selenium/mouse.rb
|
95
95
|
- lib/applitools/selenium/move_to_region_visibility_strategy.rb
|
96
96
|
- lib/applitools/selenium/nop_region_visibility_strategy.rb
|
97
|
+
- lib/applitools/selenium/region_provider.rb
|
97
98
|
- lib/applitools/selenium/sauce/driver.rb
|
98
99
|
- lib/applitools/selenium/scroll_position_provider.rb
|
99
100
|
- lib/applitools/selenium/takes_screenshot_image_provider.rb
|
101
|
+
- lib/applitools/selenium/target.rb
|
100
102
|
- lib/applitools/selenium/viewport_size.rb
|
101
103
|
- lib/applitools/version.rb
|
102
104
|
- lib/eyes_selenium.rb
|