eyes_selenium 3.2.2 → 3.3.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|