Skip to content

Commit fcc6bc2

Browse files
committed
Bug 1986238 - [wdspec] Update tests for scroll into view with behavior instant. r=webdriver-reviewers,Sasha
Differential Revision: https://phabricator.services.mozilla.com/D263772
1 parent 3ab78e3 commit fcc6bc2

File tree

7 files changed

+201
-51
lines changed

7 files changed

+201
-51
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import pytest
2+
3+
from tests.support.asserts import assert_success
4+
from tests.support.helpers import is_element_in_viewport
5+
6+
from . import element_clear
7+
8+
9+
def test_scroll_into_view(session, inline):
10+
session.url = inline("""
11+
<style>
12+
.scroll-container {
13+
display: block;
14+
overflow-y: scroll;
15+
scroll-behavior: smooth;
16+
height: 200px;
17+
}
18+
19+
input {
20+
margin-top: 2000vh;
21+
}
22+
</style>
23+
24+
<div class="scroll-container">
25+
<input type="text" size="20" value="foo"></input>
26+
</div>
27+
""")
28+
29+
element = session.find.css("input", all=False)
30+
response = element_clear(session, element)
31+
assert_success(response)
32+
33+
assert is_element_in_viewport(session, element)
34+
35+
assert element.property("value") == ""
36+

testing/web-platform/tests/webdriver/tests/classic/element_click/scroll_into_view.py

Lines changed: 91 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@
66

77
def element_click(session, element):
88
return session.transport.send(
9-
"POST", "session/{session_id}/element/{element_id}/click".format(
10-
session_id=session.session_id,
11-
element_id=element.id))
9+
"POST",
10+
"session/{session_id}/element/{element_id}/click".format(
11+
session_id=session.session_id, element_id=element.id
12+
),
13+
)
1214

1315

1416
def assert_one_click(session):
1517
"""Asserts there has only been one click, and returns that."""
1618
clicks = session.execute_script("return window.clicks")
1719
assert len(clicks) == 1
18-
return tuple(clicks[0])
20+
return clicks[0]
1921

2022

2123
def test_scroll_into_view(session, inline):
@@ -27,57 +29,120 @@ def test_scroll_into_view(session, inline):
2729

2830
session.window_handle = new_handle
2931

30-
session.url = inline("""
31-
<input type=text value=Federer
32-
style="position: absolute; left: 0vh; top: 500vh">""")
32+
session.url = inline(
33+
"""
34+
<style>
35+
.scroll-container {
36+
display: block;
37+
overflow-y: scroll;
38+
scroll-behavior: smooth;
39+
height: 200px;
40+
}
41+
42+
input {
43+
margin-top: 2000vh;
44+
}
45+
</style>
46+
47+
<div class="scroll-container">
48+
<input type="text" size="20" value="foo"></input>
49+
</div>
50+
51+
<script>
52+
window.clicks = [];
53+
const target = document.querySelector("input");
54+
target.addEventListener("click", function(e) {
55+
window.clicks.push({
56+
"target": e.target,
57+
"clientX": e.clientX,
58+
"clientY": e.clientY,
59+
});
60+
});
61+
</script>
62+
"""
63+
)
3364

3465
element = session.find.css("input", all=False)
3566
response = element_click(session, element)
3667
assert_success(response)
3768

69+
event_data = assert_one_click(session)
70+
assert event_data["target"] == element
71+
3872
# Check if element clicked is scrolled into view
39-
assert session.execute_script("""
73+
assert (
74+
session.execute_script(
75+
"""
4076
let input = arguments[0];
4177
rect = input.getBoundingClientRect();
4278
return rect.top >= 0 && rect.left >= 0 &&
4379
Math.floor(rect.bottom) <= window.innerHeight &&
4480
Math.floor(rect.right) <= window.innerWidth;
45-
""", args=(element,)) is True
81+
""",
82+
args=(element,),
83+
)
84+
is True
85+
)
4686

4787
session.window.close()
4888

4989
session.window_handle = original_handle
5090

91+
5192
@pytest.mark.parametrize("offset", range(9, 0, -1))
5293
def test_partially_visible_does_not_scroll(session, offset, inline):
53-
session.url = inline("""
94+
session.url = inline(
95+
f"""
5496
<style>
5597
body {{
56-
margin: 0;
57-
padding: 0;
98+
margin: 0;
99+
padding: 0;
58100
}}
59101
60102
div {{
61-
background: blue;
62-
height: 200px;
103+
background: blue;
104+
height: 200px;
63105
64-
/* make N pixels visible in the viewport */
65-
margin-top: calc(100vh - {offset}px);
106+
/* make N pixels visible in the viewport */
107+
margin-top: calc(100vh - {offset}px);
66108
}}
67109
</style>
68110
69111
<div></div>
70112
71113
<script>
72-
window.clicks = [];
73-
let target = document.querySelector("div");
74-
target.addEventListener("click", function(e) {{ window.clicks.push([e.clientX, e.clientY]); }});
114+
window.clicks = [];
115+
const target = document.querySelector("div");
116+
target.addEventListener("click", function(e) {{
117+
window.clicks.push({{
118+
"target": e.target,
119+
"clientX": e.clientX,
120+
"clientY": e.clientY,
121+
}});
122+
}});
75123
</script>
76-
""".format(offset=offset))
77-
target = session.find.css("div", all=False)
78-
assert session.execute_script("return window.scrollY || document.documentElement.scrollTop") == 0
79-
response = element_click(session, target)
124+
"""
125+
)
126+
127+
assert (
128+
session.execute_script(
129+
"return window.scrollY || document.documentElement.scrollTop"
130+
)
131+
== 0
132+
)
133+
134+
element = session.find.css("div", all=False)
135+
response = element_click(session, element)
80136
assert_success(response)
81-
assert session.execute_script("return window.scrollY || document.documentElement.scrollTop") == 0
82-
click_point = assert_one_click(session)
83-
assert click_point == pytest.approx(center_point(target), abs=1.0)
137+
138+
assert (
139+
session.execute_script(
140+
"return window.scrollY || document.documentElement.scrollTop"
141+
)
142+
== 0
143+
)
144+
145+
event_data = assert_one_click(session)
146+
assert (event_data["clientX"], event_data["clientY"]) == pytest.approx(
147+
center_point(element), abs=1.0
148+
)

testing/web-platform/tests/webdriver/tests/classic/element_send_keys/scroll_into_view.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,33 @@ def test_element_outside_of_not_scrollable_viewport(session, inline):
3131

3232

3333
def test_element_outside_of_scrollable_viewport(session, inline):
34-
session.url = inline('<input style="margin-top: 102vh;">')
35-
element = session.find.css("input", all=False)
34+
session.url = inline("""
35+
<style>
36+
.scroll-container {
37+
display: block;
38+
overflow-y: scroll;
39+
scroll-behavior: smooth;
40+
height: 200px;
41+
}
42+
43+
input {
44+
margin-top: 2000vh;
45+
}
46+
</style>
47+
48+
<div class="scroll-container">
49+
<input type="text" size="20" value="foo"></input>
50+
</div>
51+
""")
3652

37-
response = element_send_keys(session, element, "foo")
53+
element = session.find.css("input", all=False)
54+
response = element_send_keys(session, element, " bar")
3855
assert_success(response)
3956

4057
assert is_element_in_viewport(session, element)
4158

59+
assert element.property("value") == "foo bar"
60+
4261

4362
def test_contenteditable_element_outside_of_scrollable_viewport(session, inline):
4463
session.url = inline('<div contenteditable style="margin-top: 102vh;"></div>')

testing/web-platform/tests/webdriver/tests/classic/take_element_screenshot/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,13 @@ def element_dimensions(session, element):
88
Math.floor(height * devicePixelRatio),
99
];
1010
""", args=(element,)))
11+
12+
13+
def take_element_screenshot(session, element_id):
14+
return session.transport.send(
15+
"GET",
16+
"session/{session_id}/element/{element_id}/screenshot".format(
17+
session_id=session.session_id,
18+
element_id=element_id,
19+
)
20+
)

testing/web-platform/tests/webdriver/tests/classic/take_element_screenshot/iframe.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from tests.support.asserts import assert_success
44
from tests.support.image import png_dimensions
55

6-
from . import element_dimensions
6+
from . import element_dimensions, take_element_screenshot
77

88
DEFAULT_CONTENT = "<div id='content'>Lorem ipsum dolor sit amet.</div>"
99

@@ -57,16 +57,6 @@
5757
"""
5858

5959

60-
def take_element_screenshot(session, element_id):
61-
return session.transport.send(
62-
"GET",
63-
"session/{session_id}/element/{element_id}/screenshot".format(
64-
session_id=session.session_id,
65-
element_id=element_id,
66-
)
67-
)
68-
69-
7060
def test_frame_element(session, inline, iframe):
7161
# Create a reference element which looks exactly like the frame's content
7262
session.url = inline("{0}{1}".format(REFERENCE_STYLE, REFERENCE_CONTENT))

testing/web-platform/tests/webdriver/tests/classic/take_element_screenshot/screenshot.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,7 @@
44

55
from tests.support.asserts import assert_error, assert_success
66
from tests.support.image import png_dimensions
7-
from . import element_dimensions
8-
9-
10-
def take_element_screenshot(session, element_id):
11-
return session.transport.send(
12-
"GET",
13-
"session/{session_id}/element/{element_id}/screenshot".format(
14-
session_id=session.session_id,
15-
element_id=element_id,
16-
)
17-
)
7+
from . import element_dimensions, take_element_screenshot
188

199

2010
def test_no_top_browsing_context(session, closed_window):
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import pytest
2+
3+
from tests.support.asserts import assert_success
4+
from tests.support.helpers import is_element_in_viewport
5+
6+
from . import take_element_screenshot
7+
8+
9+
def test_scroll_into_view(session, inline):
10+
session.url = inline("""
11+
<style>
12+
.scroll-container {
13+
display: block;
14+
overflow-y: scroll;
15+
scroll-behavior: smooth;
16+
height: 200px;
17+
}
18+
19+
input {
20+
margin-top: 2000vh;
21+
}
22+
</style>
23+
24+
<input id="reference" type="text" size="20" value="foo"></input>
25+
<div class="scroll-container">
26+
<input id="target" type="text" size="20" value="foo"></input>
27+
</div>
28+
""")
29+
30+
reference = session.find.css("#reference", all=False)
31+
response = take_element_screenshot(session, reference.id)
32+
reference_screenshot = assert_success(response)
33+
34+
element = session.find.css("#target", all=False)
35+
response = take_element_screenshot(session, element.id)
36+
screenshot = assert_success(response)
37+
38+
assert is_element_in_viewport(session, element)
39+
40+
assert screenshot == reference_screenshot

0 commit comments

Comments
 (0)