Skip to content

Commit 77f9255

Browse files
authored
Implement native scroll actions +semver: feature (#258)
- cover with tests - add localization values for scrolling actions
1 parent a69263a commit 77f9255

File tree

12 files changed

+171
-6
lines changed

12 files changed

+171
-6
lines changed

Aquality.Selenium/src/Aquality.Selenium/Aquality.Selenium.xml

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Aquality.Selenium/src/Aquality.Selenium/Browsers/Browser.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
using System.Collections.ObjectModel;
1111

1212
using IDevTools = OpenQA.Selenium.DevTools.IDevTools;
13+
using OpenQA.Selenium.Interactions;
14+
using static OpenQA.Selenium.Interactions.WheelInputDevice;
1315

1416
namespace Aquality.Selenium.Browsers
1517
{
@@ -319,9 +321,32 @@ public ReadOnlyCollection<LogEntry> GetLogs(string logKind)
319321
/// <param name="y">Vertical coordinate.</param>
320322
public void ScrollWindowBy(int x, int y)
321323
{
324+
Logger.Info("loc.scrolling.by", x, y);
325+
new Actions(Driver).ScrollByAmount(x, y).Perform();
326+
}
327+
328+
/// <summary>
329+
/// Scrolls window by coordinates using JavaScript.
330+
/// </summary>
331+
/// <param name="x">Horizontal coordinate.</param>
332+
/// <param name="y">Vertical coordinate.</param>
333+
public void ScrollWindowByViaJs(int x, int y)
334+
{
335+
Logger.Info("loc.scrolling.by.js", x, y);
322336
ExecuteScript(JavaScript.ScrollWindowBy, x, y);
323337
}
324338

339+
/// <summary>
340+
/// Scrolls portion of screen from specified origin
341+
/// </summary>
342+
/// <param name="scrollOrigin">Origination point (either viewport or element, with possible offset).</param>
343+
/// <param name="x">Horizontal coordinate.</param>
344+
/// <param name="y">Vertical coordinate.</param>
345+
public void ScrollFromOrigin(ScrollOrigin scrollOrigin, int x, int y)
346+
{
347+
new Actions(Driver).ScrollFromOrigin(scrollOrigin, x, y).Perform();
348+
}
349+
325350
/// <summary>
326351
/// Executes JS script from embedded resource file (*.js).
327352
/// </summary>

Aquality.Selenium/src/Aquality.Selenium/Elements/Actions/JsActions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void ScrollIntoView()
9393
/// <param name="y">Vertical coordinate</param>
9494
public void ScrollBy(int x, int y)
9595
{
96-
LogElementAction("loc.scrolling.js");
96+
LogElementAction("loc.scrolling.by.js", x, y);
9797
ExecuteScript(JavaScript.ScrollBy, x, y);
9898
}
9999

Aquality.Selenium/src/Aquality.Selenium/Elements/Actions/MouseActions.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Aquality.Selenium.Core.Utilities;
77
using Aquality.Selenium.Core.Localization;
88
using Aquality.Selenium.Configurations;
9+
using static OpenQA.Selenium.Interactions.WheelInputDevice;
910

1011
namespace Aquality.Selenium.Elements.Actions
1112
{
@@ -57,6 +58,39 @@ public void RightClick()
5758
elementActionsRetrier.DoWithRetry(() => PerformAction(element => MoveToElement(element).ContextClick(element)));
5859
}
5960

61+
/// <summary>
62+
/// Scrolling page to the element.
63+
/// </summary>
64+
public void ScrollToElement()
65+
{
66+
LogElementAction("loc.scrolling");
67+
elementActionsRetrier.DoWithRetry(() => PerformAction(element => new SeleniumActions(AqualityServices.Browser.Driver).ScrollToElement(element)));
68+
}
69+
70+
/// <summary>
71+
/// Scrolling page from an element.
72+
/// </summary>
73+
public void ScrollFromOrigin(int x, int y, int? xOffset = null, int? yOffset = null)
74+
{
75+
LogElementAction("loc.scrolling.by", x, y);
76+
elementActionsRetrier.DoWithRetry(() =>
77+
{
78+
var scrollOrigin = new ScrollOrigin
79+
{
80+
Element = element.GetElement()
81+
};
82+
if (xOffset != null)
83+
{
84+
scrollOrigin.XOffset = xOffset.Value;
85+
}
86+
if (yOffset != null)
87+
{
88+
scrollOrigin.YOffset = yOffset.Value;
89+
}
90+
AqualityServices.Browser.ScrollFromOrigin(scrollOrigin, x, y);
91+
});
92+
}
93+
6094
/// <summary>
6195
/// Moves mouse to the element.
6296
/// </summary>

Aquality.Selenium/src/Aquality.Selenium/Forms/Form.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ protected Form(By locator, string name)
8686
/// <param name="x">horizontal coordinate</param>
8787
/// <param name="y">vertical coordinate</param>
8888
public void ScrollBy(int x, int y)
89+
{
90+
FormElement.MouseActions.ScrollFromOrigin(x, y);
91+
}
92+
93+
/// <summary>
94+
/// Scroll form via JavaScript without scrolling entire page
95+
/// </summary>
96+
/// <param name="x">horizontal coordinate</param>
97+
/// <param name="y">vertical coordinate</param>
98+
public void ScrollByJs(int x, int y)
8999
{
90100
FormElement.JsActions.ScrollBy(x, y);
91101
}

Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/be.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@
6666
"loc.movingFrom": "Адводзім курсор мышы ад элемента",
6767
"loc.radio": "Радыёкнопка",
6868
"loc.scrolling.center.js": "Пракручваем старонку да цэнтра элемента праз JavaScript",
69-
"loc.scrolling.js": "Пракручваем старонку праз JavaScript",
69+
"loc.scrolling.js": "Пракручваем старонку да элемента праз JavaScript",
70+
"loc.scrolling": "Пракручваем старонку да элемента",
71+
"loc.scrolling.by": "Пракручваем на ({0},{1})",
72+
"loc.scrolling.by.js": "Пракручваем на ({0},{1}) праз JavaScript",
7073
"loc.selecting.value": "Выбіраем значэнне - '{0}'",
7174
"loc.deselecting.value": "Адмяняем выбар значэння - '{0}'",
7275
"loc.send.text": "Задаем тэкст - '{0}'",

Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/en.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@
6666
"loc.movingFrom": "Moving mouse from element",
6767
"loc.radio": "RadioButton",
6868
"loc.scrolling.center.js": "Scrolling to the center via JavaScript",
69-
"loc.scrolling.js": "Scrolling via JavaScript",
69+
"loc.scrolling.js": "Scrolling to element via JavaScript",
70+
"loc.scrolling": "Scrolling to element",
71+
"loc.scrolling.by": "Scrolling by ({0},{1})",
72+
"loc.scrolling.by.js": "Scrolling by ({0},{1}) via JavaScript",
7073
"loc.selecting.value": "Selecting value - '{0}'",
7174
"loc.deselecting.value": "Deselecting value - '{0}'",
7275
"loc.send.text": "Setting text - '{0}'",

Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/pl.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@
6666
"loc.movingFrom": "Przesuwanie myszy z elementu",
6767
"loc.radio": "RadioButton",
6868
"loc.scrolling.center.js": "Przewijanie do centrum przez JavaScript",
69-
"loc.scrolling.js": "Przewijanie przez JavaScript",
69+
"loc.scrolling.js": "Przewijanie do elementu przez JavaScript",
70+
"loc.scrolling": "Przewijanie do elementu",
71+
"loc.scrolling.by": "Przewijanie o ({0},{1})",
72+
"loc.scrolling.by.js": "Przewijanie o ({0},{1}) przez JavaScript",
7073
"loc.selecting.value": "Wybieranie wartości - '{0}'",
7174
"loc.deselecting.value": "Anulowanie wybierania wartości - '{0}'",
7275
"loc.send.text": "Ustawianie tekstu - '{0}'",

Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/ru.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@
6666
"loc.movingFrom": "Сдвиг курсора с элемента",
6767
"loc.radio": "Радиокнопка",
6868
"loc.scrolling.center.js": "Скроллинг в центр посредством JavaScript",
69-
"loc.scrolling.js": "Скроллинг с помощью JavaScript",
69+
"loc.scrolling.js": "Скроллинг к элементу с помощью JavaScript",
70+
"loc.scrolling": "Скроллинг к элементу",
71+
"loc.scrolling.by": "Скроллинг на ({0},{1})",
72+
"loc.scrolling.by.js": "Скроллинг на ({0},{1}) с помощью JavaScript",
7073
"loc.selecting.value": "Выбор значения - '{0}'",
7174
"loc.deselecting.value": "Отмена выбора значения - '{0}'",
7275
"loc.send.text": "Ввод текста - '{0}'",

Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/uk.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@
6666
"loc.movingFrom": "Переміщення миші від елемента",
6767
"loc.radio": "Радіокнопка",
6868
"loc.scrolling.center.js": "Прокрутка до центру за допомогою JavaScript",
69-
"loc.scrolling.js": "Прокрутка за допомогою JavaScript",
69+
"loc.scrolling.js": "Прокрутка до елемента за допомогою JavaScript",
70+
"loc.scrolling": "Прокрутка до елемента",
71+
"loc.scrolling.by": "Прокрутка на ({0},{1})",
72+
"loc.scrolling.by.js": "Прокрутка на ({0},{1}) за допомогою JavaScript",
7073
"loc.selecting.value": "Вибір значення - '{0}'",
7174
"loc.deselecting.value": "Скасування выбору значення - '{0}'",
7275
"loc.send.text": "Встановлення тексту - '{0}'",

Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Actions/MouseActionsTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,38 @@ public void Should_BePossibleTo_MoveToElement()
4242
JQueryMenuForm.EnabledButton.MouseActions.MoveToElement();
4343
Assert.That(JQueryMenuForm.IsEnabledButtonFocused, "Element should be focused after move mouse");
4444
}
45+
46+
[Test]
47+
public void Should_BePossibleTo_ScrollToElement()
48+
{
49+
var infiniteScrollForm = new InfiniteScrollForm();
50+
infiniteScrollForm.Open();
51+
infiniteScrollForm.WaitForPageToLoad();
52+
var size = infiniteScrollForm.LastExampleLabel.Visual.Size;
53+
AqualityServices.Browser.SetWindowSize(size.Width, size.Height);
54+
var defaultCount = infiniteScrollForm.ExampleLabels.Count;
55+
Assert.DoesNotThrow(
56+
() => AqualityServices.ConditionalWait.WaitForTrue(() =>
57+
{
58+
infiniteScrollForm.LastExampleLabel.MouseActions.ScrollToElement();
59+
return infiniteScrollForm.ExampleLabels.Count > defaultCount;
60+
}), "Some examples should be added after scroll");
61+
}
62+
63+
[Test]
64+
public void Should_BePossibleTo_ScrollFromOrigin()
65+
{
66+
var infiniteScrollForm = new InfiniteScrollForm();
67+
infiniteScrollForm.Open();
68+
infiniteScrollForm.WaitForPageToLoad();
69+
var defaultCount = infiniteScrollForm.ExampleLabels.Count;
70+
Assert.DoesNotThrow(
71+
() => AqualityServices.ConditionalWait.WaitForTrue(() =>
72+
{
73+
var formHeight = infiniteScrollForm.Size.Height;
74+
infiniteScrollForm.LastExampleLabel.MouseActions.ScrollFromOrigin(0, formHeight);
75+
return infiniteScrollForm.ExampleLabels.Count > defaultCount;
76+
}), "Some examples should be added after scroll");
77+
}
4578
}
4679
}

Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,22 @@ public void Should_BePossibleTo_ScrollWindowBy()
200200
}), "Some examples should be added after scroll");
201201
}
202202

203+
[Test]
204+
public void Should_BePossibleTo_ScrollWindowBy_ViaJs()
205+
{
206+
var infiniteScrollForm = new InfiniteScrollForm();
207+
infiniteScrollForm.Open();
208+
infiniteScrollForm.WaitForPageToLoad();
209+
var defaultCount = infiniteScrollForm.ExampleLabels.Count;
210+
Assert.DoesNotThrow(
211+
() => AqualityServices.ConditionalWait.WaitForTrue(() =>
212+
{
213+
var formHeight = infiniteScrollForm.Size.Height;
214+
AqualityServices.Browser.ScrollWindowByViaJs(0, formHeight);
215+
return infiniteScrollForm.ExampleLabels.Count > defaultCount;
216+
}), "Some examples should be added after scroll");
217+
}
218+
203219
[Test]
204220
public void Should_BePossibleTo_GetBrowserName()
205221
{

0 commit comments

Comments
 (0)