Skip to content

Commit 5519bab

Browse files
committed
[java] use convenience methods for scrolling
1 parent 45754dc commit 5519bab

3 files changed

Lines changed: 68 additions & 23 deletions

File tree

java/src/org/openqa/selenium/interactions/Actions.java

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -272,19 +272,42 @@ public Actions release(WebElement target) {
272272
}
273273

274274
/**
275-
* Scrolls by the provided amount from a designated origination point.
276-
* The scroll origin is either the center of an element or the upper left of the viewport plus offsets.
275+
* If the element is outside the viewport, scrolls the bottom of the element to the bottom of the viewport.
276+
*
277+
* @param element Which element to scroll into the viewport.
278+
* @return A self reference.
279+
*/
280+
public Actions scrollToElement(WebElement element) {
281+
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(element);
282+
return tick(getActiveWheel().createScroll(0, 0, 0, 0, Duration.ofMillis(250), scrollOrigin));
283+
}
284+
285+
/**
286+
* Scrolls by provided amounts with the origin in the top left corner of the viewport.
287+
*
288+
* @param deltaX The distance along X axis to scroll using the wheel. A negative value scrolls left.
289+
* @param deltaY The distance along Y axis to scroll using the wheel. A negative value scrolls up.
290+
* @return A self reference.
291+
*/
292+
public Actions scrollByAmount(int deltaX, int deltaY) {
293+
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromViewport();
294+
return tick(getActiveWheel().createScroll(0, 0, deltaX, deltaY, Duration.ofMillis(250), scrollOrigin));
295+
}
296+
297+
/**
298+
* Scrolls by provided amount based on a provided origin.
299+
* The scroll origin is either the center of an element or the upper left of the viewport plus any offsets.
277300
* If the origin is an element, and the element is not in the viewport, the bottom of the element will first
278301
* be scrolled to the bottom of the viewport.
279-
*
280-
* @param x The horizontal offset from the origin from which to start the scroll.
281-
* @param y The vertical offset from the origin from which to start the scroll.
302+
* @param scrollOrigin Where scroll originates (viewport or element center) plus provided offsets.
282303
* @param deltaX The distance along X axis to scroll using the wheel. A negative value scrolls left.
283304
* @param deltaY The distance along Y axis to scroll using the wheel. A negative value scrolls up.
284-
* @param scrollOrigin Where scroll originates, either the viewport or the center of an element.
285305
* @return A self reference.
306+
* @throws MoveTargetOutOfBoundsException If the origin with offset is outside the viewport.
286307
*/
287-
public Actions scroll( int x, int y, int deltaX, int deltaY, WheelInput.ScrollOrigin scrollOrigin) {
308+
public Actions scrollFromOrigin(WheelInput.ScrollOrigin scrollOrigin, int deltaX, int deltaY) {
309+
int x = scrollOrigin.getxOffset();
310+
int y = scrollOrigin.getyOffset();
288311
return tick(getActiveWheel().createScroll(x, y, deltaX, deltaY, Duration.ofMillis(250), scrollOrigin));
289312
}
290313

java/src/org/openqa/selenium/interactions/WheelInput.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ public Map<String, Object> encode() {
109109

110110
public static final class ScrollOrigin {
111111
private final Object originObject;
112+
private int xOffset = 0;
113+
private int yOffset = 0;
112114

113115
public Object asArg() {
114116
Object arg = originObject;
@@ -118,16 +120,38 @@ public Object asArg() {
118120
return arg;
119121
}
120122

121-
private ScrollOrigin(Object originObject) {
123+
private ScrollOrigin(Object originObject, int xOffset, int yOffset) {
122124
this.originObject = originObject;
125+
this.xOffset = xOffset;
126+
this.yOffset = yOffset;
123127
}
124128

125129
public static ScrollOrigin fromViewport() {
126-
return new ScrollOrigin("viewport");
130+
return new ScrollOrigin("viewport", 0, 0);
131+
}
132+
133+
public static ScrollOrigin fromViewport(int xOffset, int yOffset) {
134+
return new ScrollOrigin("viewport",
135+
Require.nonNull("xOffset", xOffset),
136+
Require.nonNull("yOffset", yOffset));
127137
}
128138

129139
public static ScrollOrigin fromElement(WebElement element) {
130-
return new ScrollOrigin(Require.nonNull("Element", element));
140+
return new ScrollOrigin(Require.nonNull("Element", element), 0, 0);
141+
}
142+
143+
public static ScrollOrigin fromElement(WebElement element, int xOffset, int yOffset) {
144+
return new ScrollOrigin(Require.nonNull("Element", element),
145+
Require.nonNull("xOffset", xOffset),
146+
Require.nonNull("yOffset", yOffset));
147+
}
148+
149+
public int getxOffset() {
150+
return xOffset;
151+
}
152+
153+
public int getyOffset() {
154+
return yOffset;
131155
}
132156
}
133157
}

java/test/org/openqa/selenium/interactions/DefaultWheelTest.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ public void shouldScrollToElement() {
4343

4444
assertFalse(inViewport(iframe));
4545

46-
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(iframe);
47-
getBuilder(driver).scroll(0, 0, 0, 0, scrollOrigin).perform();
46+
getBuilder(driver).scrollToElement(iframe).perform();
4847

4948
assertTrue(inViewport(iframe));
5049
}
@@ -55,7 +54,7 @@ public void shouldScrollFromElementByGivenAmount() {
5554
WebElement iframe = driver.findElement(By.tagName("iframe"));
5655
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(iframe);
5756

58-
getBuilder(driver).scroll(0, 0, 0, 200, scrollOrigin).perform();
57+
getBuilder(driver).scrollFromOrigin(scrollOrigin, 0, 200).perform();
5958

6059
driver.switchTo().frame(iframe);
6160
WebElement checkbox = driver.findElement(By.name("scroll_checkbox"));
@@ -66,9 +65,9 @@ public void shouldScrollFromElementByGivenAmount() {
6665
public void shouldScrollFromElementByGivenAmountWithOffset() {
6766
driver.get(appServer.whereIs("scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html"));
6867
WebElement footer = driver.findElement(By.tagName("footer"));
69-
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(footer);
68+
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(footer, 0, -50);
7069

71-
getBuilder(driver).scroll(0, -50, 0, 200, scrollOrigin).perform();
70+
getBuilder(driver).scrollFromOrigin(scrollOrigin,0, 200).perform();
7271

7372
WebElement iframe = driver.findElement(By.tagName("iframe"));
7473
driver.switchTo().frame(iframe);
@@ -80,29 +79,28 @@ public void shouldScrollFromElementByGivenAmountWithOffset() {
8079
public void throwErrorWhenElementOriginIsOutOfViewport() {
8180
driver.get(appServer.whereIs("scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html"));
8281
WebElement footer = driver.findElement(By.tagName("footer"));
83-
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(footer);
82+
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromElement(footer, 0, 50);
8483

85-
getBuilder(driver).scroll(0, 50, 0, 200, scrollOrigin).perform();
84+
getBuilder(driver).scrollFromOrigin(scrollOrigin, 0, 200).perform();
8685
}
8786

8887
@Test
8988
public void shouldScrollFromViewportByGivenAmount() {
9089
driver.get(appServer.whereIs("scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html"));
9190
WebElement footer = driver.findElement(By.tagName("footer"));
9291
int deltaY = footer.getRect().y;
93-
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromViewport();
9492

95-
getBuilder(driver).scroll(0, 0, 0, deltaY, scrollOrigin).perform();
93+
getBuilder(driver).scrollByAmount(0, deltaY).perform();
9694

9795
assertTrue(inViewport(footer));
9896
}
9997

10098
@Test
10199
public void shouldScrollFromViewportByGivenAmountFromOrigin() {
102100
driver.get(appServer.whereIs("scrolling_tests/frame_with_nested_scrolling_frame.html"));
103-
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromViewport();
101+
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromViewport(10, 10);
104102

105-
getBuilder(driver).scroll(10, 10, 0, 200, scrollOrigin).perform();
103+
getBuilder(driver).scrollFromOrigin(scrollOrigin, 0, 200).perform();
106104

107105
WebElement iframe = driver.findElement(By.tagName("iframe"));
108106
driver.switchTo().frame(iframe);
@@ -113,9 +111,9 @@ public void shouldScrollFromViewportByGivenAmountFromOrigin() {
113111
@Test(expected = MoveTargetOutOfBoundsException.class)
114112
public void throwErrorWhenOriginOffsetIsOutOfViewport() {
115113
driver.get(appServer.whereIs("scrolling_tests/frame_with_nested_scrolling_frame.html"));
116-
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromViewport();
114+
WheelInput.ScrollOrigin scrollOrigin = WheelInput.ScrollOrigin.fromViewport(-10, -10);
117115

118-
getBuilder(driver).scroll(-10, -10, 0, 200, scrollOrigin).perform();
116+
getBuilder(driver).scrollFromOrigin(scrollOrigin, 0, 200).perform();
119117
}
120118

121119
private boolean inViewport(WebElement element) {

0 commit comments

Comments
 (0)