watir 7.0.0 → 7.1.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/CHANGES.md +9 -0
- data/lib/watir/elements/element.rb +39 -13
- data/lib/watir/js_snippets/isElementInViewport.js +20 -0
- data/lib/watir/scroll.rb +2 -1
- data/lib/watir/version.rb +1 -1
- data/spec/watirspec/after_hooks_spec.rb +0 -2
- data/spec/watirspec/drag_and_drop_spec.rb +12 -0
- data/spec/watirspec/elements/div_spec.rb +12 -1
- data/spec/watirspec/elements/element_spec.rb +91 -18
- data/spec/watirspec/html/scroll.html +8 -25
- data/spec/watirspec/html/sticky_elements.html +10 -0
- data/spec/watirspec/scroll_spec.rb +72 -42
- data/spec/watirspec_helper.rb +0 -1
- metadata +5 -4
- data/spec/watirspec/html/hover.html +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8a3f59dcd9f56e63cf532cc2ba8c9605e8ffad78bd59d3f104e6677c9f5e20c
|
4
|
+
data.tar.gz: 1f1cb55a4270ebdce957f4a8dc33e76403eef391ed59e3179f4f6772595d3f59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 488c6b2f0a93a20390350da8b95025f9e33d2be9bb7bd84b130808906bca067860b3db6908c59961ef3914ccbb682d2d15d2418656749f8916a1416fa8c6cbb5
|
7
|
+
data.tar.gz: 64bc4a7b36c294a75ceb86c3fea21809dbefc158cbca08ba72dc6bf7b3b64d76f04b5c02130a8cce15e78d5156659cb317ee397e27d93d06e537e804695e425b
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
### 7.1.0 (2021-11-15)
|
2
|
+
|
3
|
+
* Add automatic scroll to `Element#click` with method parameters to ensure element is in viewport
|
4
|
+
* Provide `:scroll_to` parameter for element methods implemented with `Actions` class (thanks osadasami #948, #949)
|
5
|
+
* Allow `:scroll_to` parameter to accept `nil` argument to avoid automatic scrolling
|
6
|
+
* Implement `Element#in_viewport?`
|
7
|
+
* Fix but where `Scroll#to` for `Browser` with `:center` argument did not scroll to center of page
|
8
|
+
* Change `Element#obscured?` to only scroll when element out of viewport and then scroll to bottom instead of top
|
9
|
+
|
1
10
|
### 7.0.0 (2021-10-18)
|
2
11
|
|
3
12
|
* Requires Selenium 4.0.0+
|
@@ -146,9 +146,10 @@ module Watir
|
|
146
146
|
# @param [:shift, :alt, :control, :command, :meta] modifiers to press while clicking.
|
147
147
|
#
|
148
148
|
|
149
|
-
def click(*modifiers)
|
149
|
+
def click(*modifiers, scroll_to: :center)
|
150
150
|
element_call(:wait_for_enabled) do
|
151
151
|
if modifiers.any?
|
152
|
+
scroll.to(scroll_to) if scroll_to
|
152
153
|
action = driver.action
|
153
154
|
modifiers.each { |mod| action.key_down mod }
|
154
155
|
action.click @element
|
@@ -202,10 +203,13 @@ module Watir
|
|
202
203
|
# @example
|
203
204
|
# browser.element(name: "new_user_button").double_click
|
204
205
|
#
|
206
|
+
# @example
|
207
|
+
# browser.element(name: "new_user_button").double_click(scroll_to: :center)
|
208
|
+
#
|
205
209
|
|
206
|
-
def double_click
|
210
|
+
def double_click(scroll_to: :center)
|
207
211
|
element_call(:wait_for_present) do
|
208
|
-
scroll.to
|
212
|
+
scroll.to(scroll_to) if scroll_to
|
209
213
|
driver.action.double_click(@element).perform
|
210
214
|
end
|
211
215
|
browser.after_hooks.run
|
@@ -237,12 +241,16 @@ module Watir
|
|
237
241
|
# @example Click an element with several modifier keys pressed
|
238
242
|
# browser.element(name: "new_user_button").right_click(:shift, :alt)
|
239
243
|
#
|
240
|
-
# @
|
244
|
+
# @example Click an element with several modifier keys pressed and scroll position
|
245
|
+
# browser.element(name: "new_user_button").right_click(:shift, :alt, scroll_to: :center)
|
246
|
+
#
|
247
|
+
# @param [:shift, :alt, :control, :command, :meta, scroll_to: :center]
|
248
|
+
# modifiers to press while right clicking and scroll position.
|
241
249
|
#
|
242
250
|
|
243
|
-
def right_click(*modifiers)
|
251
|
+
def right_click(*modifiers, scroll_to: :center)
|
244
252
|
element_call(:wait_for_present) do
|
245
|
-
scroll.to
|
253
|
+
scroll.to(scroll_to) if scroll_to
|
246
254
|
action = driver.action
|
247
255
|
if modifiers.any?
|
248
256
|
modifiers.each { |mod| action.key_down mod }
|
@@ -264,10 +272,13 @@ module Watir
|
|
264
272
|
# @example
|
265
273
|
# browser.element(name: "new_user_button").hover
|
266
274
|
#
|
275
|
+
# @example
|
276
|
+
# browser.element(name: "new_user_button").hover(scroll_to: :center)
|
277
|
+
#
|
267
278
|
|
268
|
-
def hover
|
279
|
+
def hover(scroll_to: :center)
|
269
280
|
element_call(:wait_for_present) do
|
270
|
-
scroll.to
|
281
|
+
scroll.to(scroll_to) if scroll_to
|
271
282
|
driver.action.move_to(@element).perform
|
272
283
|
end
|
273
284
|
end
|
@@ -280,13 +291,14 @@ module Watir
|
|
280
291
|
# a = browser.div(id: "draggable")
|
281
292
|
# b = browser.div(id: "droppable")
|
282
293
|
# a.drag_and_drop_on b
|
294
|
+
# a.drag_and_drop_on b, scroll_to: :center
|
283
295
|
#
|
284
296
|
|
285
|
-
def drag_and_drop_on(other)
|
297
|
+
def drag_and_drop_on(other, scroll_to: :center)
|
286
298
|
assert_is_element other
|
287
299
|
|
288
300
|
value = element_call(:wait_for_present) do
|
289
|
-
scroll.to
|
301
|
+
scroll.to(scroll_to) if scroll_to
|
290
302
|
driver.action
|
291
303
|
.drag_and_drop(@element, other.wd)
|
292
304
|
.perform
|
@@ -302,13 +314,17 @@ module Watir
|
|
302
314
|
# @example
|
303
315
|
# browser.div(id: "draggable").drag_and_drop_by 100, 25
|
304
316
|
#
|
317
|
+
# @example
|
318
|
+
# browser.div(id: "draggable").drag_and_drop_by 100, 25, scroll_to: :center
|
319
|
+
#
|
305
320
|
# @param [Integer] right_by
|
306
321
|
# @param [Integer] down_by
|
322
|
+
# @param [Symbol] scroll_to
|
307
323
|
#
|
308
324
|
|
309
|
-
def drag_and_drop_by(right_by, down_by)
|
325
|
+
def drag_and_drop_by(right_by, down_by, scroll_to: :center)
|
310
326
|
element_call(:wait_for_present) do
|
311
|
-
scroll.to
|
327
|
+
scroll.to(scroll_to) if scroll_to
|
312
328
|
driver.action
|
313
329
|
.drag_and_drop_by(@element, right_by, down_by)
|
314
330
|
.perform
|
@@ -530,11 +546,21 @@ module Watir
|
|
530
546
|
element_call do
|
531
547
|
return true unless present?
|
532
548
|
|
533
|
-
scroll.to
|
549
|
+
scroll.to :bottom unless in_viewport?
|
534
550
|
execute_js(:elementObscured, self)
|
535
551
|
end
|
536
552
|
end
|
537
553
|
|
554
|
+
#
|
555
|
+
# Returns true if the top of the element is visible in the viewport.
|
556
|
+
#
|
557
|
+
# @return [Boolean]
|
558
|
+
#
|
559
|
+
|
560
|
+
def in_viewport?
|
561
|
+
element_call { execute_js(:isElementInViewport, @element) }
|
562
|
+
end
|
563
|
+
|
538
564
|
#
|
539
565
|
# Returns given style property of this element.
|
540
566
|
#
|
@@ -0,0 +1,20 @@
|
|
1
|
+
function(){
|
2
|
+
var el = arguments[0];
|
3
|
+
var top = el.offsetTop;
|
4
|
+
var left = el.offsetLeft;
|
5
|
+
var width = el.offsetWidth;
|
6
|
+
var height = el.offsetHeight;
|
7
|
+
|
8
|
+
while (el.offsetParent) {
|
9
|
+
el = el.offsetParent;
|
10
|
+
top += el.offsetTop;
|
11
|
+
left += el.offsetLeft;
|
12
|
+
}
|
13
|
+
|
14
|
+
return (
|
15
|
+
top < (window.pageYOffset + window.innerHeight) &&
|
16
|
+
left < (window.pageXOffset + window.innerWidth) &&
|
17
|
+
(top + height) > window.pageYOffset &&
|
18
|
+
(left + width) > window.pageXOffset
|
19
|
+
);
|
20
|
+
}
|
data/lib/watir/scroll.rb
CHANGED
@@ -58,7 +58,8 @@ module Watir
|
|
58
58
|
when :top, :start
|
59
59
|
'window.scrollTo(0, 0);'
|
60
60
|
when :center
|
61
|
-
'
|
61
|
+
y = '(document.body.scrollHeight - window.innerHeight) / 2 + document.body.getBoundingClientRect().top'
|
62
|
+
"window.scrollTo(window.outerWidth / 2, #{y});"
|
62
63
|
when :bottom, :end
|
63
64
|
'window.scrollTo(0, document.body.scrollHeight);'
|
64
65
|
when Array
|
data/lib/watir/version.rb
CHANGED
@@ -98,7 +98,6 @@ describe 'Browser::AfterHooks' do
|
|
98
98
|
@page_after_hook = proc { @yield = browser.title == 'Non-control elements' }
|
99
99
|
browser.after_hooks.add @page_after_hook
|
100
100
|
div = browser.div(id: 'html_test')
|
101
|
-
div.scroll.to
|
102
101
|
div.double_click
|
103
102
|
expect(@yield).to be true
|
104
103
|
end
|
@@ -108,7 +107,6 @@ describe 'Browser::AfterHooks' do
|
|
108
107
|
@page_after_hook = proc { @yield = browser.title == 'Right Click Test' }
|
109
108
|
browser.after_hooks.add @page_after_hook
|
110
109
|
div = browser.div(id: 'click')
|
111
|
-
div.scroll.to
|
112
110
|
div.right_click
|
113
111
|
expect(@yield).to be true
|
114
112
|
end
|
@@ -13,10 +13,22 @@ describe 'Element' do
|
|
13
13
|
expect(droppable.text).to include 'Dropped!'
|
14
14
|
end
|
15
15
|
|
16
|
+
it 'can drag and drop an element onto another with specified scroll position' do
|
17
|
+
expect(droppable.text).to include 'Drop here'
|
18
|
+
draggable.drag_and_drop_on droppable, scroll_to: :center
|
19
|
+
expect(droppable.text).to include 'Dropped!'
|
20
|
+
end
|
21
|
+
|
16
22
|
it 'can drag an element by the given offset' do
|
17
23
|
expect(droppable.text).to include 'Drop here'
|
18
24
|
draggable.drag_and_drop_by 200, 50
|
19
25
|
expect(droppable.text).to include 'Dropped!'
|
20
26
|
end
|
27
|
+
|
28
|
+
it 'can drag an element by the given offset with specified scroll position' do
|
29
|
+
expect(droppable.text).to include 'Drop here'
|
30
|
+
draggable.drag_and_drop_by 200, 50, scroll_to: :center
|
31
|
+
expect(droppable.text).to include 'Dropped!'
|
32
|
+
end
|
21
33
|
end
|
22
34
|
end
|
@@ -170,10 +170,15 @@ describe 'Div' do
|
|
170
170
|
except: {browser: :safari, reason: 'command correctly received, but action not taken'} do
|
171
171
|
it 'fires the ondblclick event' do
|
172
172
|
div = browser.div(id: 'html_test')
|
173
|
-
div.scroll.to
|
174
173
|
div.double_click
|
175
174
|
expect(messages).to include('double clicked')
|
176
175
|
end
|
176
|
+
|
177
|
+
it 'fires the ondblclick event with specified scroll position' do
|
178
|
+
div = browser.div(id: 'html_test')
|
179
|
+
div.double_click(scroll_to: :center)
|
180
|
+
expect(messages).to include('double clicked')
|
181
|
+
end
|
177
182
|
end
|
178
183
|
|
179
184
|
describe '#double_click!' do
|
@@ -196,6 +201,12 @@ describe 'Div' do
|
|
196
201
|
expect(event_log.first).to eq('control=true alt=true')
|
197
202
|
end
|
198
203
|
|
204
|
+
it 'accepts modifiers with scroll position', except: {browser: :ie} do
|
205
|
+
browser.goto(WatirSpec.url_for('right_click.html'))
|
206
|
+
browser.div(id: 'click-logger').right_click(:control, :alt, scroll_to: :center)
|
207
|
+
expect(event_log.first).to eq('control=true alt=true')
|
208
|
+
end
|
209
|
+
|
199
210
|
it 'scrolls' do
|
200
211
|
browser.del(class: 'footer').double_click
|
201
212
|
puts 'yes?'
|
@@ -623,15 +623,65 @@ describe 'Element' do
|
|
623
623
|
end
|
624
624
|
|
625
625
|
describe '#hover' do
|
626
|
-
|
627
|
-
|
628
|
-
|
626
|
+
def element_color(element)
|
627
|
+
case element.style('color')
|
628
|
+
when 'rgba(0, 0, 255, 1)'
|
629
|
+
:blue
|
630
|
+
when 'rgba(255, 165, 0, 1)', 'rgb(255, 165, 0)'
|
631
|
+
:orange
|
632
|
+
else
|
633
|
+
raise rgba
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
637
|
+
it 'allows scrolling to top', except: {browser: :ie,
|
638
|
+
reason: 'needs require_window_focus'} do
|
639
|
+
browser.goto(WatirSpec.url_for('scroll.html'))
|
640
|
+
element = browser.div(id: 'center')
|
641
|
+
|
642
|
+
element.hover(scroll_to: :top)
|
643
|
+
expect(element_color(element)).to eq :orange
|
644
|
+
|
645
|
+
element_top = browser.execute_script('return arguments[0].getBoundingClientRect().top', element)
|
646
|
+
expect(element_top).to be_within(1).of(0)
|
647
|
+
end
|
648
|
+
|
649
|
+
it 'scrolls to center by default', except: {browser: :ie,
|
650
|
+
reason: 'needs require_window_focus'} do
|
651
|
+
browser.goto(WatirSpec.url_for('scroll.html'))
|
652
|
+
element = browser.div(id: 'center')
|
653
|
+
|
654
|
+
element.hover
|
655
|
+
expect(element_color(element)).to eq :orange
|
656
|
+
|
657
|
+
element_rect = browser.execute_script('return arguments[0].getBoundingClientRect()', element)
|
658
|
+
|
659
|
+
expect(element_rect['top']).to eq(element_rect['bottom'] - element_rect['height'])
|
660
|
+
end
|
661
|
+
|
662
|
+
it 'allows scrolling to bottom', except: {browser: :ie,
|
663
|
+
reason: 'needs require_window_focus'} do
|
664
|
+
browser.goto(WatirSpec.url_for('scroll.html'))
|
665
|
+
element = browser.div(id: 'center')
|
666
|
+
|
667
|
+
element.hover(scroll_to: :bottom)
|
668
|
+
expect(element_color(element)).to eq :orange
|
669
|
+
|
670
|
+
element_bottom = browser.execute_script('return arguments[0].getBoundingClientRect().bottom', element)
|
671
|
+
window_height = browser.execute_script('return window.innerHeight')
|
672
|
+
|
673
|
+
expect(element_bottom).to be_within(1).of(window_height)
|
674
|
+
end
|
675
|
+
|
676
|
+
it 'allows not scrolling', except: {browser: %i[chrome edge],
|
677
|
+
reason: 'https://bugs.chromium.org/p/chromedriver/issues/detail?id=3955'} do
|
678
|
+
browser.goto(WatirSpec.url_for('scroll.html'))
|
679
|
+
element = browser.div(id: 'center')
|
680
|
+
|
681
|
+
browser.execute_script('return window.pageYOffset;')
|
682
|
+
browser.execute_script('return window.innerHeight;')
|
629
683
|
|
630
|
-
expect
|
631
|
-
link.scroll.to
|
632
|
-
link.hover
|
633
|
-
link.wait_until { |l| l.style('font-size') == '20px' }
|
634
|
-
expect(link.style('font-size')).to eq '20px'
|
684
|
+
expect { element.hover(scroll_to: nil) }.to raise_exception Selenium::WebDriver::Error::MoveTargetOutOfBoundsError
|
635
685
|
end
|
636
686
|
end
|
637
687
|
|
@@ -914,40 +964,63 @@ describe 'Element' do
|
|
914
964
|
|
915
965
|
it 'returns false if element center is not covered' do
|
916
966
|
btn = browser.button(id: 'not_obscured')
|
917
|
-
|
967
|
+
btn.scroll.to :center
|
918
968
|
expect { btn.click }.not_to raise_exception
|
969
|
+
expect(btn).not_to be_obscured
|
919
970
|
end
|
920
971
|
|
921
972
|
it 'returns false if element center is covered by its descendant' do
|
922
973
|
btn = browser.button(id: 'has_descendant')
|
923
|
-
|
974
|
+
btn.scroll.to :center
|
924
975
|
expect { btn.click }.not_to raise_exception
|
976
|
+
expect(btn).not_to be_obscured
|
925
977
|
end
|
926
978
|
|
927
979
|
it 'returns true if element center is covered by a non-descendant',
|
928
980
|
except: {browser: :safari, reason: 'not getting element click intercepted'} do
|
929
981
|
btn = browser.button(id: 'obscured')
|
930
|
-
|
931
|
-
|
982
|
+
btn.scroll.to :center
|
932
983
|
expect { btn.click }.to raise_exception(Selenium::WebDriver::Error::ElementClickInterceptedError)
|
984
|
+
expect(btn).to be_obscured
|
933
985
|
end
|
934
986
|
|
935
987
|
it 'returns false if element center is surrounded by non-descendants' do
|
936
988
|
btn = browser.button(id: 'surrounded')
|
937
|
-
|
989
|
+
btn.scroll.to :center
|
938
990
|
expect { btn.click }.not_to raise_exception
|
991
|
+
expect(btn).not_to be_obscured
|
939
992
|
end
|
940
993
|
|
941
|
-
it 'scrolls
|
942
|
-
|
943
|
-
|
944
|
-
|
994
|
+
it 'correctly scrolls element below viewport' do
|
995
|
+
browser.goto WatirSpec.url_for('sticky_elements.html')
|
996
|
+
|
997
|
+
element = browser.div(id: 'center')
|
998
|
+
|
999
|
+
browser.scroll.to :top
|
1000
|
+
expect { element.click }.not_to raise_exception
|
1001
|
+
|
1002
|
+
browser.scroll.to :top
|
1003
|
+
expect(element).not_to be_obscured
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
it 'correctly scrolls element above viewport',
|
1007
|
+
except: {browser: %i[chrome edge],
|
1008
|
+
reason: 'https://bugs.chromium.org/p/chromedriver/issues/detail?id=3954'} do
|
1009
|
+
browser.goto WatirSpec.url_for('sticky_elements.html')
|
1010
|
+
element = browser.div(id: 'center')
|
1011
|
+
|
1012
|
+
browser.scroll.to :bottom
|
1013
|
+
expect { element.click }.not_to raise_exception
|
1014
|
+
|
1015
|
+
browser.scroll.to :bottom
|
1016
|
+
expect(element).not_to be_obscured
|
945
1017
|
end
|
946
1018
|
|
947
1019
|
it 'scrolls non-interactive element into view before checking if obscured' do
|
948
1020
|
div = browser.div(id: 'requires_scrolling_container')
|
949
|
-
expect(div).not_to be_obscured
|
950
1021
|
expect { div.click }.not_to raise_exception
|
1022
|
+
browser.scroll.to :top
|
1023
|
+
expect(div).not_to be_obscured
|
951
1024
|
end
|
952
1025
|
|
953
1026
|
it 'returns true if element cannot be scrolled into view' do
|
@@ -1,32 +1,15 @@
|
|
1
1
|
<html>
|
2
2
|
<head>
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
var width = el.offsetWidth;
|
8
|
-
var height = el.offsetHeight;
|
9
|
-
|
10
|
-
while (el.offsetParent) {
|
11
|
-
el = el.offsetParent;
|
12
|
-
top += el.offsetTop;
|
13
|
-
left += el.offsetLeft;
|
14
|
-
}
|
15
|
-
|
16
|
-
return (
|
17
|
-
top < (window.pageYOffset + window.innerHeight) &&
|
18
|
-
left < (window.pageXOffset + window.innerWidth) &&
|
19
|
-
(top + height) > window.pageYOffset &&
|
20
|
-
(left + width) > window.pageXOffset
|
21
|
-
);
|
22
|
-
}
|
23
|
-
</script>
|
3
|
+
<style media="screen">
|
4
|
+
div { color: blue; }
|
5
|
+
div:hover { color: orange; }
|
6
|
+
</style>
|
24
7
|
</head>
|
25
8
|
<body>
|
26
|
-
<div style="height:
|
27
|
-
<
|
28
|
-
<
|
29
|
-
<
|
9
|
+
<div style="height: 300%; position: relative;">
|
10
|
+
<div id="top" style="position: absolute; top: 0;">top</div>
|
11
|
+
<div id="center" style="position: absolute; top: 50%;">Center</div>
|
12
|
+
<div id="bottom" style="position: absolute; top: 100%;">bottom</div>
|
30
13
|
</div>
|
31
14
|
</body>
|
32
15
|
</html>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<div style="height: 300%; position: relative;">
|
4
|
+
<header style="position: sticky; z-index: 10; top: 0;"><h1>Sticky Header</h1></header>
|
5
|
+
<div id="top" style="position: absolute; top: 0;">top</div>
|
6
|
+
<div id="center" style="position: absolute; top: 50%;">Center</div>
|
7
|
+
<div id="bottom" style="position: absolute; top: 100%;">bottom</div>
|
8
|
+
</div>
|
9
|
+
</body>
|
10
|
+
</html>
|
@@ -5,101 +5,131 @@ describe Watir::Scrolling do
|
|
5
5
|
browser.goto(WatirSpec.url_for('scroll.html'))
|
6
6
|
end
|
7
7
|
|
8
|
-
def
|
9
|
-
browser.execute_script('return
|
8
|
+
def top_centered_viewport
|
9
|
+
browser.execute_script('return (window.innerHeight - document.body.scrollHeight)/2;')
|
10
|
+
end
|
11
|
+
|
12
|
+
def current_top
|
13
|
+
browser.execute_script('return document.body.getBoundingClientRect().top;')
|
10
14
|
end
|
11
15
|
|
12
16
|
context 'when scrolling Browser' do
|
13
17
|
describe '#to' do
|
14
18
|
it 'scrolls to the top of the page' do
|
15
19
|
browser.scroll.to :bottom
|
20
|
+
expect(browser.div(id: 'top')).not_to be_in_viewport
|
16
21
|
browser.scroll.to :top
|
17
|
-
expect(
|
18
|
-
expect(visible?(browser.button(text: 'Center'))).to eq(true)
|
19
|
-
expect(visible?(browser.button(text: 'Bottom'))).to eq(false)
|
22
|
+
expect(browser.div(id: 'top')).to be_in_viewport
|
20
23
|
end
|
21
24
|
|
22
25
|
it 'scrolls to the center of the page' do
|
23
26
|
browser.scroll.to :center
|
24
|
-
|
25
|
-
|
26
|
-
expect(
|
27
|
+
viewport_top = browser.execute_script('return document.body.getBoundingClientRect().top;')
|
28
|
+
|
29
|
+
expect(viewport_top).to be_within(1).of(top_centered_viewport)
|
27
30
|
end
|
28
31
|
|
29
32
|
it 'scrolls to the bottom of the page' do
|
33
|
+
expect(browser.div(id: 'bottom')).not_to be_in_viewport
|
30
34
|
browser.scroll.to :bottom
|
31
|
-
expect(
|
32
|
-
expect(visible?(browser.button(text: 'Center'))).to eq(true)
|
33
|
-
expect(visible?(browser.button(text: 'Bottom'))).to eq(true)
|
35
|
+
expect(browser.div(id: 'bottom')).to be_in_viewport
|
34
36
|
end
|
35
37
|
|
36
38
|
it 'scrolls to coordinates' do
|
37
|
-
|
38
|
-
|
39
|
-
|
39
|
+
element = browser.div(id: 'center')
|
40
|
+
location = element.location
|
41
|
+
browser.scroll.to [location.x, location.y]
|
42
|
+
expect(element).to be_in_viewport
|
40
43
|
end
|
41
44
|
|
42
|
-
it 'raises error when scroll point is not
|
45
|
+
it 'raises error when scroll point is not valid' do
|
43
46
|
expect { browser.scroll.to(:blah) }.to raise_error(ArgumentError)
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
47
50
|
describe '#by' do
|
48
|
-
|
51
|
+
before do
|
52
|
+
sleep(0.1)
|
53
|
+
browser.scroll.to :top
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'offset from top' do
|
57
|
+
initial_top = current_top
|
58
|
+
scroll_by = top_centered_viewport
|
59
|
+
browser.scroll.by(0, -scroll_by)
|
60
|
+
|
61
|
+
expect(current_top).to be_within(1).of(scroll_by + initial_top)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'offset from bottom' do
|
65
|
+
browser.scroll.to :top
|
66
|
+
initial_top = current_top
|
49
67
|
browser.scroll.to :bottom
|
50
|
-
|
68
|
+
scroll_by = top_centered_viewport
|
69
|
+
browser.scroll.by(0, scroll_by)
|
51
70
|
|
52
|
-
expect(
|
53
|
-
expect(visible?(browser.button(text: 'Center'))).to eq(true)
|
54
|
-
expect(visible?(browser.button(text: 'Bottom'))).to eq(false)
|
71
|
+
expect(current_top).to be_within(1).of(scroll_by + initial_top)
|
55
72
|
end
|
56
73
|
end
|
57
74
|
end
|
58
75
|
|
59
76
|
context 'when scrolling Element' do
|
60
77
|
describe '#to' do
|
61
|
-
it 'scrolls to element (top)' do
|
62
|
-
browser.
|
63
|
-
|
64
|
-
|
65
|
-
|
78
|
+
it 'scrolls to element (top) by default' do
|
79
|
+
element = browser.div(id: 'center')
|
80
|
+
element.scroll.to
|
81
|
+
|
82
|
+
element_top = browser.execute_script('return arguments[0].getBoundingClientRect().top', element)
|
83
|
+
expect(element_top).to be_within(1).of(0)
|
66
84
|
end
|
67
85
|
|
68
86
|
it 'scrolls to element (center)' do
|
69
|
-
browser.
|
70
|
-
|
71
|
-
|
72
|
-
|
87
|
+
element = browser.div(id: 'center')
|
88
|
+
element.scroll.to :center
|
89
|
+
|
90
|
+
element_rect = browser.execute_script('return arguments[0].getBoundingClientRect()', element)
|
91
|
+
|
92
|
+
expect(element_rect['top']).to eq(element_rect['bottom'] - element_rect['height'])
|
73
93
|
end
|
74
94
|
|
75
95
|
it 'scrolls to element (bottom)' do
|
76
|
-
browser.
|
77
|
-
|
78
|
-
|
79
|
-
|
96
|
+
element = browser.div(id: 'center')
|
97
|
+
element.scroll.to :bottom
|
98
|
+
|
99
|
+
element_bottom = browser.execute_script('return arguments[0].getBoundingClientRect().bottom', element)
|
100
|
+
window_height = browser.execute_script('return window.innerHeight')
|
101
|
+
|
102
|
+
expect(element_bottom).to be_within(1).of(window_height)
|
80
103
|
end
|
81
104
|
|
82
105
|
it 'scrolls to element multiple times' do
|
83
106
|
2.times do
|
84
|
-
browser.
|
85
|
-
|
107
|
+
element = browser.div(id: 'center')
|
108
|
+
element.scroll.to(:center)
|
109
|
+
|
110
|
+
element_rect = browser.execute_script('return arguments[0].getBoundingClientRect()', element)
|
111
|
+
|
112
|
+
expect(element_rect['top']).to eq(element_rect['bottom'] - element_rect['height'])
|
86
113
|
end
|
87
114
|
end
|
88
115
|
|
89
|
-
it 'raises error when scroll param is not
|
90
|
-
expect { browser.
|
116
|
+
it 'raises error when scroll param is not valid' do
|
117
|
+
expect { browser.div(id: 'top').scroll.to(:blah) }.to raise_error(ArgumentError)
|
91
118
|
end
|
92
119
|
end
|
93
120
|
|
94
121
|
describe '#by' do
|
95
122
|
it 'offset' do
|
123
|
+
sleep 0.1
|
124
|
+
browser.scroll.to :top
|
125
|
+
initial_top = current_top
|
96
126
|
browser.scroll.to :bottom
|
97
|
-
|
98
|
-
|
127
|
+
scroll_by = top_centered_viewport
|
128
|
+
|
129
|
+
element = browser.div(id: 'bottom')
|
130
|
+
element.scroll.by(0, scroll_by)
|
99
131
|
|
100
|
-
expect(
|
101
|
-
expect(visible?(browser.button(text: 'Center'))).to eq(true)
|
102
|
-
expect(visible?(browser.button(text: 'Bottom'))).to eq(false)
|
132
|
+
expect(current_top).to be_within(1).of(scroll_by + initial_top)
|
103
133
|
end
|
104
134
|
end
|
105
135
|
end
|
data/spec/watirspec_helper.rb
CHANGED
@@ -39,7 +39,6 @@ class LocalConfig
|
|
39
39
|
Webdrivers::Geckodriver.update
|
40
40
|
"geckodriver version: #{Webdrivers::Geckodriver.current_version.version}"
|
41
41
|
when :ie
|
42
|
-
Webdrivers::IEdriver.required_version = '3.150.1'
|
43
42
|
Webdrivers::IEdriver.update
|
44
43
|
"iedriver version: #{Webdrivers::IEdriver.current_version.version}"
|
45
44
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Rodionov
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-11-15 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: selenium-webdriver
|
@@ -364,6 +364,7 @@ files:
|
|
364
364
|
- lib/watir/js_snippets/getInnerText.js
|
365
365
|
- lib/watir/js_snippets/getOuterHtml.js
|
366
366
|
- lib/watir/js_snippets/getTextContent.js
|
367
|
+
- lib/watir/js_snippets/isElementInViewport.js
|
367
368
|
- lib/watir/js_snippets/isImageLoaded.js
|
368
369
|
- lib/watir/js_snippets/selectOptionsLabel.js
|
369
370
|
- lib/watir/js_snippets/selectOptionsText.js
|
@@ -543,7 +544,6 @@ files:
|
|
543
544
|
- spec/watirspec/html/frame_1.html
|
544
545
|
- spec/watirspec/html/frame_2.html
|
545
546
|
- spec/watirspec/html/frames.html
|
546
|
-
- spec/watirspec/html/hover.html
|
547
547
|
- spec/watirspec/html/iframe_1.html
|
548
548
|
- spec/watirspec/html/iframes.html
|
549
549
|
- spec/watirspec/html/images.html
|
@@ -581,6 +581,7 @@ files:
|
|
581
581
|
- spec/watirspec/html/right_click.html
|
582
582
|
- spec/watirspec/html/scroll.html
|
583
583
|
- spec/watirspec/html/special_chars.html
|
584
|
+
- spec/watirspec/html/sticky_elements.html
|
584
585
|
- spec/watirspec/html/tables.html
|
585
586
|
- spec/watirspec/html/timeout_window_location.html
|
586
587
|
- spec/watirspec/html/uneven_table.html
|
@@ -751,7 +752,6 @@ test_files:
|
|
751
752
|
- spec/watirspec/html/frame_1.html
|
752
753
|
- spec/watirspec/html/frame_2.html
|
753
754
|
- spec/watirspec/html/frames.html
|
754
|
-
- spec/watirspec/html/hover.html
|
755
755
|
- spec/watirspec/html/iframe_1.html
|
756
756
|
- spec/watirspec/html/iframes.html
|
757
757
|
- spec/watirspec/html/images.html
|
@@ -789,6 +789,7 @@ test_files:
|
|
789
789
|
- spec/watirspec/html/right_click.html
|
790
790
|
- spec/watirspec/html/scroll.html
|
791
791
|
- spec/watirspec/html/special_chars.html
|
792
|
+
- spec/watirspec/html/sticky_elements.html
|
792
793
|
- spec/watirspec/html/tables.html
|
793
794
|
- spec/watirspec/html/timeout_window_location.html
|
794
795
|
- spec/watirspec/html/uneven_table.html
|