Skip to content

Commit e24e3a9

Browse files
authored
[Visual Testing] Add ability of visualization checks for the Form (#204) +semver: breaking
* update Aquality.Selenium.Core nuget package * inherit Form from Core.Forms.Form * [breaking] removed [Obsolete] properties and methods from the Form abstraction * add "visualization" section to settings.json * add visual tests * Stabilization of automation practice site interactions closes #200, fixes #201 * Fix sonar code smells
1 parent 4ffa56b commit e24e3a9

24 files changed

+230
-122
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,4 @@ msbuild.wrn
3737
.vs/
3838

3939
Log/
40+
VisualDumps/

Aquality.Selenium/src/Aquality.Selenium/Aquality.Selenium.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969

7070
<ItemGroup>
7171
<PackageReference Include="Microsoft.Edge.SeleniumTools" Version="3.141.2" />
72-
<PackageReference Include="Aquality.Selenium.Core" Version="1.3.1" />
72+
<PackageReference Include="Aquality.Selenium.Core" Version="1.6.1" />
7373
<PackageReference Include="WebDriverManager" Version="2.11.1" />
7474
</ItemGroup>
7575

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

Lines changed: 15 additions & 30 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/BrowserTabNavigation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void SwitchToTab(int index, bool closeCurrent = false)
7474
var names = TabHandles;
7575
if (index < 0 || names.Count <= index)
7676
{
77-
throw new IndexOutOfRangeException(
77+
throw new ArgumentOutOfRangeException(
7878
$"Index of browser tab '{index}' you provided is out of range {0}..{names.Count}");
7979
}
8080

Aquality.Selenium/src/Aquality.Selenium/Elements/Element.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1-
using OpenQA.Selenium;
2-
using Aquality.Selenium.Browsers;
3-
using Aquality.Selenium.Elements.Actions;
4-
using Aquality.Selenium.Elements.Interfaces;
5-
using Aquality.Selenium.Core.Elements;
1+
using Aquality.Selenium.Browsers;
62
using Aquality.Selenium.Configurations;
7-
using Aquality.Selenium.Core.Utilities;
83
using Aquality.Selenium.Core.Applications;
4+
using Aquality.Selenium.Core.Configurations;
5+
using Aquality.Selenium.Core.Elements;
96
using Aquality.Selenium.Core.Localization;
7+
using Aquality.Selenium.Core.Logging;
8+
using Aquality.Selenium.Core.Utilities;
9+
using Aquality.Selenium.Core.Visualization;
1010
using Aquality.Selenium.Core.Waitings;
11+
using Aquality.Selenium.Elements.Actions;
12+
using Aquality.Selenium.Elements.Interfaces;
13+
using OpenQA.Selenium;
14+
using System.Reflection;
15+
using System.Linq;
1116
using CoreElement = Aquality.Selenium.Core.Elements.Element;
1217
using ICoreElementFactory = Aquality.Selenium.Core.Elements.Interfaces.IElementFactory;
1318
using ICoreElementFinder = Aquality.Selenium.Core.Elements.Interfaces.IElementFinder;
1419
using ICoreElementStateProvider = Aquality.Selenium.Core.Elements.Interfaces.IElementStateProvider;
15-
using Aquality.Selenium.Core.Configurations;
16-
using System.Reflection;
17-
using System.Linq;
1820

1921
namespace Aquality.Selenium.Elements
2022
{
@@ -55,6 +57,8 @@ protected Element(By locator, string name, ElementState state) : base(locator, n
5557

5658
protected override IConditionalWait ConditionalWait => AqualityServices.ConditionalWait;
5759

60+
protected override IImageComparator ImageComparator => AqualityServices.Get<IImageComparator>();
61+
5862
public void ClickAndWait()
5963
{
6064
Click();

Aquality.Selenium/src/Aquality.Selenium/Elements/ElementStateProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
using Aquality.Selenium.Core.Elements;
2-
using Aquality.Selenium.Core.Elements.Interfaces;
1+
using Aquality.Selenium.Core.Elements.Interfaces;
2+
using Aquality.Selenium.Core.Logging;
33
using Aquality.Selenium.Core.Waitings;
44
using OpenQA.Selenium;
55
using CoreElementStateProvider = Aquality.Selenium.Core.Elements.ElementStateProvider;
Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Drawing;
4-
using OpenQA.Selenium;
5-
using Aquality.Selenium.Core.Elements;
6-
using Aquality.Selenium.Core.Logging;
1+
using System.Drawing;
72
using Aquality.Selenium.Browsers;
3+
using Aquality.Selenium.Core.Logging;
4+
using Aquality.Selenium.Core.Forms;
85
using Aquality.Selenium.Elements.Interfaces;
6+
using OpenQA.Selenium;
97
using IElementStateProvider = Aquality.Selenium.Core.Elements.Interfaces.IElementStateProvider;
8+
using Aquality.Selenium.Core.Configurations;
9+
using Aquality.Selenium.Core.Localization;
10+
using Aquality.Selenium.Core.Waitings;
1011

1112
namespace Aquality.Selenium.Forms
1213
{
1314
/// <summary>
1415
/// Defines base class for any UI form.
1516
/// </summary>
16-
public abstract class Form
17+
public abstract class Form : Form<IElement>
1718
{
1819
private readonly ILabel formLabel;
1920
/// <summary>
@@ -39,6 +40,21 @@ protected Form(By locator, string name)
3940
/// </summary>
4041
protected static Logger Logger => AqualityServices.Logger;
4142

43+
/// <summary>
44+
/// Visualization configuration used by <see cref="Form{T}.Dump"/>.
45+
/// </summary>
46+
protected override IVisualizationConfiguration VisualizationConfiguration => AqualityServices.Get<IVisualizationConfiguration>();
47+
48+
/// <summary>
49+
/// Localized logger used by <see cref="Form{T}.Dump"/>.
50+
/// </summary>
51+
protected override ILocalizedLogger LocalizedLogger => AqualityServices.LocalizedLogger;
52+
53+
/// <summary>
54+
/// Conditional wait <see cref="IConditionalWait"/>
55+
/// </summary>
56+
protected static IConditionalWait ConditionalWait => AqualityServices.ConditionalWait;
57+
4258
/// <summary>
4359
/// Element factory <see cref="IElementFactory"/>
4460
/// </summary>
@@ -52,15 +68,7 @@ protected Form(By locator, string name)
5268
/// <summary>
5369
/// Name of the form.
5470
/// </summary>
55-
public string Name { get; }
56-
57-
/// <summary>
58-
/// Return form state for form locator
59-
/// </summary>
60-
/// <value>True - form is opened,
61-
/// False - form is not opened.</value>
62-
[Obsolete("This property will be removed in the future release. Use State.WaitForDisplayed() if needed")]
63-
public bool IsDisplayed => FormElement.State.WaitForDisplayed();
71+
public override string Name { get; }
6472

6573
/// <summary>
6674
/// Provides ability to get form's state (whether it is displayed, exists or not) and respective waiting functions.
@@ -70,7 +78,7 @@ protected Form(By locator, string name)
7078
/// <summary>
7179
/// Gets size of form element defined by its locator.
7280
/// </summary>
73-
public Size Size => FormElement.GetElement().Size;
81+
public Size Size => FormElement.Visual.Size;
7482

7583
/// <summary>
7684
/// Scroll form without scrolling entire page
@@ -81,38 +89,5 @@ public void ScrollBy(int x, int y)
8189
{
8290
FormElement.JsActions.ScrollBy(x, y);
8391
}
84-
85-
/// <summary>
86-
/// Finds child element of current form by its locator.
87-
/// </summary>
88-
/// <typeparam name="T">Type of child element that has to implement IElement.</typeparam>
89-
/// <param name="childLocator">Locator of child element relative to form.</param>
90-
/// <param name="name">Child element name.</param>
91-
/// <param name="supplier">Delegate that defines constructor of child element in case of custom element.</param>
92-
/// <param name="state">Child element state.</param>
93-
/// <returns>Instance of child element.</returns>
94-
[Obsolete("This method will be removed in the future release. Use FormElement property methods to find child element")]
95-
protected T FindChildElement<T>(By childLocator, string name = null, ElementSupplier<T> supplier = null, ElementState state = ElementState.Displayed)
96-
where T : IElement
97-
{
98-
return FormElement.FindChildElement(childLocator, name, supplier, state);
99-
}
100-
101-
/// <summary>
102-
/// Finds child elements of current form by their locator.
103-
/// </summary>
104-
/// <typeparam name="T">Type of child elements that has to implement IElement.</typeparam>
105-
/// <param name="childLocator">Locator of child elements relative to form.</param>
106-
/// <param name="name">Child elements name.</param>
107-
/// <param name="supplier">Delegate that defines constructor of child element in case of custom element type.</param>
108-
/// <param name="expectedCount">Expected number of elements that have to be found (zero, more then zero, any).</param>
109-
/// <param name="state">Child elements state.</param>
110-
/// <returns>List of child elements.</returns>
111-
[Obsolete("This method will be removed in the future release. Use FormElement property methods to find child elements")]
112-
protected IList<T> FindChildElements<T>(By childLocator, string name = null, ElementSupplier<T> supplier = null, ElementsCount expectedCount = ElementsCount.Any, ElementState state = ElementState.Displayed)
113-
where T : IElement
114-
{
115-
return FormElement.FindChildElements(childLocator, name, supplier, expectedCount, state);
116-
}
11792
}
11893
}

Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,5 +110,11 @@
110110
},
111111
"elementCache": {
112112
"isEnabled": false
113+
},
114+
"visualization": {
115+
"defaultThreshold": 0.012,
116+
"comparisonWidth": 16,
117+
"comparisonHeight": 16,
118+
"pathToDumps": "../../../Resources/VisualDumps/"
113119
}
114120
}

Aquality.Selenium/tests/Aquality.Selenium.Tests/Aquality.Selenium.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
</ItemGroup>
2626

2727
<ItemGroup>
28-
<PackageReference Include="nunit" Version="3.13.0" />
28+
<PackageReference Include="nunit" Version="3.13.2" />
2929
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0">
3030
<PrivateAssets>all</PrivateAssets>
3131
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3232
</PackageReference>
33-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
33+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
3434
</ItemGroup>
3535

3636
<ItemGroup>

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using Aquality.Selenium.Browsers;
66
using Aquality.Selenium.Core.Elements;
77
using Aquality.Selenium.Elements;
8-
using Aquality.Selenium.Tests.Integration.TestApp;
98
using Aquality.Selenium.Tests.Integration.TestApp.AutomationPractice.Forms;
109
using Aquality.Selenium.Tests.Integration.TestApp.TheInternet.Forms;
1110
using NUnit.Framework;
@@ -47,7 +46,7 @@ public void Should_BePossibleTo_HighlightElement()
4746
[Test]
4847
public void Should_BePossibleTo_HoverMouse()
4948
{
50-
AqualityServices.Browser.GoTo(Constants.UrlAutomationPractice);
49+
OpenAutomationPracticeSite();
5150
var productList = new ProductListForm();
5251
productList.NavigateToLastProduct();
5352

@@ -60,7 +59,7 @@ public void Should_BePossibleTo_HoverMouse()
6059
[Test]
6160
public void Should_BePossibleTo_SetFocus()
6261
{
63-
AqualityServices.Browser.GoTo(Constants.UrlAutomationPractice);
62+
OpenAutomationPracticeSite();
6463
var productList = new ProductListForm();
6564
productList.NavigateToLastProduct();
6665

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Aquality.Selenium.Browsers;
2-
using Aquality.Selenium.Tests.Integration.TestApp;
32
using Aquality.Selenium.Tests.Integration.TestApp.AutomationPractice.Forms;
43
using Aquality.Selenium.Tests.Integration.TestApp.TheInternet.Forms;
54
using NUnit.Framework;
@@ -39,7 +38,7 @@ public void Should_BePossibleTo_RightClick()
3938
[Test]
4039
public void Should_BePossibleTo_MoveToElement()
4140
{
42-
AqualityServices.Browser.GoTo(Constants.UrlAutomationPractice);
41+
OpenAutomationPracticeSite();
4342
var productList = new ProductListForm();
4443
productList.NavigateToLastProduct();
4544

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public void Should_BePossibleTo_SwitchToNewTabByIndex_AndClose()
135135
[Test]
136136
public void Should_BeThrow_IfSwitchToNewTab_ByIncorrectIndex()
137137
{
138-
Assert.Throws(typeof(IndexOutOfRangeException), () => { AqualityServices.Browser.Tabs().SwitchToTab(10, true); });
138+
Assert.Throws<ArgumentOutOfRangeException>(() => { AqualityServices.Browser.Tabs().SwitchToTab(10, true); });
139139
}
140140

141141
private void CheckSwitchingBy(int expectedTabCount, Action switchMethod)

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Aquality.Selenium.Browsers;
2-
using Aquality.Selenium.Tests.Integration.TestApp;
32
using Aquality.Selenium.Tests.Integration.TestApp.AutomationPractice.Forms;
43
using Aquality.Selenium.Tests.Integration.TestApp.TheInternet.Forms;
54
using TheInternetAuthenticationForm = Aquality.Selenium.Tests.Integration.TestApp.TheInternet.Forms.AuthenticationForm;
@@ -189,12 +188,11 @@ public void Should_BePossibleTo_SetWindowSize()
189188
[Test]
190189
public void Should_BePossibleTo_ScrollWindowBy()
191190
{
192-
var browser = AqualityServices.Browser;
193-
browser.GoTo(Constants.UrlAutomationPractice);
191+
OpenAutomationPracticeSite();
194192
var sliderForm = new SliderForm();
195193
var initialY = sliderForm.FormPointInViewPort.Y;
196194
var formHeight = sliderForm.Size.Height;
197-
browser.ScrollWindowBy(0, formHeight);
195+
AqualityServices.Browser.ScrollWindowBy(0, formHeight);
198196
Assert.LessOrEqual(Math.Abs(formHeight - (initialY - sliderForm.FormPointInViewPort.Y)), 1, "Window should be scrolled.");
199197
}
200198

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
using Aquality.Selenium.Browsers;
2-
using Aquality.Selenium.Core.Elements;
1+
using Aquality.Selenium.Core.Elements;
32
using Aquality.Selenium.Elements;
4-
using Aquality.Selenium.Tests.Integration.TestApp;
53
using Aquality.Selenium.Tests.Integration.TestApp.AutomationPractice.Forms;
64
using NUnit.Framework;
75
using System;
@@ -30,7 +28,7 @@ private static readonly Func<ElementState, ElementsCount, IList<Label>>[] Elemen
3028
[SetUp]
3129
public void BeforeTest()
3230
{
33-
AqualityServices.Browser.GoTo(Constants.UrlAutomationPractice);
31+
OpenAutomationPracticeSite();
3432
}
3533

3634
[Test]

Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/TestApp/AutomationPractice/Forms/ProductListForm.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Aquality.Selenium.Core.Elements;
66
using Aquality.Selenium.Elements.Interfaces;
77
using Aquality.Selenium.Forms;
8+
using Aquality.Selenium.Tests.Integration.TestApp.AutomationPractice.Helpers;
89
using OpenQA.Selenium;
910

1011
namespace Aquality.Selenium.Tests.Integration.TestApp.AutomationPractice.Forms
@@ -26,8 +27,7 @@ public ProductListForm() : base(By.XPath(FormLocator), "Product list")
2627

2728
public void NavigateToLastProduct()
2829
{
29-
AqualityServices.Browser.GoTo(GetLastProduct().Href);
30-
AqualityServices.Browser.WaitForPageToLoad();
30+
SiteLoader.OpenAutomationPracticeSite(GetLastProduct().Href);
3131
}
3232

3333
public ILink GetLastProduct()

0 commit comments

Comments
 (0)