Skip to content

Commit 2fa3f91

Browse files
authored
Move to Aquality.Selenium.Core (#152) +semver: major
* Add core nuget package #148 * #148 Move to Selenium.Core * #148 Rename ApplicationFactory to BrowserFactory * #148 Override ElementStateProvider * #148 Fix SonarQube CodeSmells * Update ChromeDriver version * Update test for implicit wait * Add detailes to the error message
1 parent 5fe6fa1 commit 2fa3f91

File tree

81 files changed

+389
-2006
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+389
-2006
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
</ItemGroup>
6060

6161
<ItemGroup>
62+
<PackageReference Include="Aquality.Selenium.Core" Version="0.2.0" />
6263
<PackageReference Include="NLog" Version="4.6.6" />
6364
<PackageReference Include="Selenium.Support" Version="3.141.0" />
6465
<PackageReference Include="Selenium.WebDriver" Version="3.141.0" />

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

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,47 @@
11
using Aquality.Selenium.Configurations;
2-
using Aquality.Selenium.Localization;
3-
using Aquality.Selenium.Logging;
4-
using Aquality.Selenium.Waitings;
2+
using Aquality.Selenium.Core.Applications;
3+
using Aquality.Selenium.Core.Localization;
54
using OpenQA.Selenium;
65
using OpenQA.Selenium.Remote;
76
using OpenQA.Selenium.Support.Extensions;
8-
using System;
97
using System.Drawing;
108
using System.Reflection;
9+
using System;
10+
using Microsoft.Extensions.DependencyInjection;
11+
using Aquality.Selenium.Core.Waitings;
1112

1213
namespace Aquality.Selenium.Browsers
1314
{
1415
/// <summary>
1516
/// Provides functionality to work with browser via Selenium WebDriver.
1617
/// </summary>
17-
public class Browser
18+
public class Browser : IApplication
1819
{
19-
private readonly IConfiguration configuration;
2020
private TimeSpan implicitWaitTimeout;
2121
private TimeSpan pageLoadTimeout;
22+
private readonly IBrowserProfile browserProfile;
23+
private readonly ConditionalWait conditionalWait;
2224

2325
/// <summary>
2426
/// Instantiate browser.
2527
/// </summary>
2628
/// <param name="webDriver">Instance of Selenium WebDriver for desired web browser.</param>
27-
/// <param name="configuration">Configuration.</param>
28-
public Browser(RemoteWebDriver webDriver, IConfiguration configuration)
29+
public Browser(RemoteWebDriver webDriver, IServiceProvider serviceProvider)
2930
{
30-
this.configuration = configuration;
3131
Driver = webDriver;
32-
BrowserName = configuration.BrowserProfile.BrowserName;
33-
SetImplicitWaitTimeout(configuration.TimeoutConfiguration.Implicit);
34-
SetPageLoadTimeout(configuration.TimeoutConfiguration.PageLoad);
35-
SetScriptTimeout(configuration.TimeoutConfiguration.Script);
32+
Logger = serviceProvider.GetRequiredService<LocalizationLogger>();
33+
LocalizationManager = serviceProvider.GetRequiredService<LocalizationManager>();
34+
browserProfile = serviceProvider.GetRequiredService<IBrowserProfile>();
35+
conditionalWait = serviceProvider.GetRequiredService<ConditionalWait>();
36+
var timeoutConfiguration = serviceProvider.GetRequiredService<ITimeoutConfiguration>();
37+
SetImplicitWaitTimeout(timeoutConfiguration.Implicit);
38+
SetPageLoadTimeout(timeoutConfiguration.PageLoad);
39+
SetScriptTimeout(timeoutConfiguration.Script);
3640
}
3741

38-
private Logger Logger => Logger.Instance;
42+
private LocalizationLogger Logger { get; }
43+
44+
private LocalizationManager LocalizationManager { get; }
3945

4046
/// <summary>
4147
/// Gets instance of Selenium WebDriver.
@@ -47,7 +53,7 @@ public Browser(RemoteWebDriver webDriver, IConfiguration configuration)
4753
/// Gets name of desired browser from configuration.
4854
/// </summary>
4955
/// <value>Name of browser.</value>
50-
public BrowserName BrowserName { get; }
56+
public BrowserName BrowserName => browserProfile.BrowserName;
5157

5258
/// <summary>
5359
/// Sets Selenium WebDriver ImplicitWait timeout.
@@ -71,7 +77,7 @@ public void SetImplicitWaitTimeout(TimeSpan timeout)
7177
/// <param name="timeout">Desired page load timeout.</param>
7278
public void SetPageLoadTimeout(TimeSpan timeout)
7379
{
74-
if (!configuration.BrowserProfile.BrowserName.Equals(BrowserName.Safari))
80+
if (!BrowserName.Equals(BrowserName.Safari))
7581
{
7682
Driver.Manage().Timeouts().PageLoad = timeout;
7783
pageLoadTimeout = timeout;
@@ -91,7 +97,7 @@ public void SetScriptTimeout(TimeSpan timeout)
9197
/// <summary>
9298
/// Gets browser configured download directory.
9399
/// </summary>
94-
public string DownloadDirectory => configuration.BrowserProfile.DriverSettings.DownloadDir;
100+
public string DownloadDirectory => browserProfile.DriverSettings.DownloadDir;
95101

96102
/// <summary>
97103
/// Gets URL of currently opened page in web browser.
@@ -101,7 +107,7 @@ public string CurrentUrl
101107
{
102108
get
103109
{
104-
Logger.InfoLoc("loc.browser.getUrl");
110+
Logger.Info("loc.browser.getUrl");
105111
return Driver.Url;
106112
}
107113
}
@@ -111,7 +117,7 @@ public string CurrentUrl
111117
/// </summary>
112118
public void Quit()
113119
{
114-
Logger.InfoLoc("loc.browser.driver.quit");
120+
Logger.Info("loc.browser.driver.quit");
115121
Driver?.Quit();
116122
}
117123

@@ -189,7 +195,7 @@ public void HandleAlert(AlertAction alertAction, string text = null)
189195
}
190196
catch (NoAlertPresentException ex)
191197
{
192-
Logger.FatalLoc("loc.browser.alert.fail", ex);
198+
Logger.Fatal("loc.browser.alert.fail", ex);
193199
throw;
194200
}
195201
}
@@ -199,7 +205,7 @@ public void HandleAlert(AlertAction alertAction, string text = null)
199205
/// </summary>
200206
public void Maximize()
201207
{
202-
Logger.InfoLoc("loc.browser.maximize");
208+
Logger.Info("loc.browser.maximize");
203209
Driver.Manage().Window.Maximize();
204210
}
205211

@@ -209,8 +215,8 @@ public void Maximize()
209215
/// <exception cref="TimeoutException">Throws when timeout exceeded and page is not loaded.</exception>
210216
public void WaitForPageToLoad()
211217
{
212-
var errorMessage = LocalizationManager.Instance.GetLocalizedMessage("loc.browser.page.timeout");
213-
ConditionalWait.WaitForTrue(() => ExecuteScript<bool>(JavaScript.IsPageLoaded), pageLoadTimeout, message: errorMessage);
218+
var errorMessage = LocalizationManager.GetLocalizedMessage("loc.browser.page.timeout");
219+
conditionalWait.WaitForTrue(() => ExecuteScript<bool>(JavaScript.IsPageLoaded), pageLoadTimeout, message: errorMessage);
214220
}
215221

216222
/// <summary>
@@ -242,6 +248,18 @@ public void ExecuteScriptFromFile(string embeddedResourcePath, params object[] a
242248
ExecuteScript(embeddedResourcePath.GetScript(Assembly.GetCallingAssembly()), arguments);
243249
}
244250

251+
/// <summary>
252+
/// Executes JS script from embedded resource file (*.js) and gets result value.
253+
/// </summary>
254+
/// <param name="embeddedResourcePath">Embedded resource path.</param>
255+
/// <param name="arguments">Script arguments.</param>
256+
/// <typeparam name="T">Type of return value.</typeparam>
257+
/// <returns>Script execution result.</returns>
258+
public T ExecuteScriptFromFile<T>(string embeddedResourcePath, params object[] arguments)
259+
{
260+
return ExecuteScript<T>(embeddedResourcePath.GetScript(Assembly.GetCallingAssembly()), arguments);
261+
}
262+
245263
/// <summary>
246264
/// Executes predefined JS script.
247265
/// </summary>
@@ -262,18 +280,6 @@ public void ExecuteScript(string script, params object[] arguments)
262280
Driver.ExecuteJavaScript(script, arguments);
263281
}
264282

265-
/// <summary>
266-
/// Executes JS script from embedded resource file (*.js) and gets result value.
267-
/// </summary>
268-
/// <param name="embeddedResourcePath">Embedded resource path.</param>
269-
/// <param name="arguments">Script arguments.</param>
270-
/// <typeparam name="T">Type of return value.</typeparam>
271-
/// <returns>Script execution result.</returns>
272-
public T ExecuteScriptFromFile<T>(string embeddedResourcePath, params object[] arguments)
273-
{
274-
return ExecuteScript<T>(embeddedResourcePath.GetScript(Assembly.GetCallingAssembly()), arguments);
275-
}
276-
277283
/// <summary>
278284
/// Executes predefined JS script and gets result value.
279285
/// </summary>

Aquality.Selenium/src/Aquality.Selenium/Browsers/BrowserFactory.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Aquality.Selenium.Configurations;
1+
using System;
22

33
namespace Aquality.Selenium.Browsers
44
{
@@ -7,12 +7,12 @@ namespace Aquality.Selenium.Browsers
77
/// </summary>
88
public abstract class BrowserFactory : IBrowserFactory
99
{
10-
protected BrowserFactory(IConfiguration configuration)
10+
protected BrowserFactory(IServiceProvider serviceProvider)
1111
{
12-
Configuration = configuration;
12+
ServiceProvider = serviceProvider;
1313
}
1414

15-
protected IConfiguration Configuration { get; }
15+
protected IServiceProvider ServiceProvider { get; }
1616

1717
public abstract Browser Browser { get; }
1818
}
Lines changed: 71 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
1-
using Aquality.Selenium.Configurations;
1+
using Aquality.Selenium.Elements;
2+
using Aquality.Selenium.Elements.Interfaces;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using System;
25
using System.Threading;
6+
using Aquality.Selenium.Core.Localization;
7+
using Aquality.Selenium.Core.Logging;
8+
using System.Reflection;
9+
using Aquality.Selenium.Core.Applications;
10+
using Aquality.Selenium.Configurations;
11+
using CoreElementFactory = Aquality.Selenium.Core.Elements.Interfaces.IElementFactory;
12+
using CoreTimeoutConfiguration = Aquality.Selenium.Core.Configurations.ITimeoutConfiguration;
13+
using ILoggerConfiguration = Aquality.Selenium.Core.Configurations.ILoggerConfiguration;
314

415
namespace Aquality.Selenium.Browsers
516
{
617
/// <summary>
718
/// Controls browser instance creation.
819
/// </summary>
9-
public static class BrowserManager
20+
public class BrowserManager : ApplicationManager<BrowserManager, Browser>
1021
{
11-
private static readonly ThreadLocal<Browser> BrowserContainer = new ThreadLocal<Browser>();
1222
private static readonly ThreadLocal<IBrowserFactory> BrowserFactoryContainer = new ThreadLocal<IBrowserFactory>();
1323

1424
/// <summary>
@@ -19,54 +29,92 @@ public static Browser Browser
1929
{
2030
get
2131
{
22-
if (!BrowserContainer.IsValueCreated || BrowserContainer.Value.Driver.SessionId == null)
23-
{
24-
SetDefaultBrowser();
25-
}
26-
return BrowserContainer.Value;
32+
return GetApplication(StartBrowserFunction, () => RegisterServices(services => Browser));
2733
}
2834
set
2935
{
30-
BrowserContainer.Value = value;
36+
SetApplication(value);
3137
}
3238
}
3339

34-
private static void SetDefaultBrowser()
40+
private static Func<IServiceProvider, Browser> StartBrowserFunction => services => BrowserFactory.Browser;
41+
42+
public static IServiceProvider ServiceProvider
3543
{
36-
if (!BrowserFactoryContainer.IsValueCreated)
44+
get
3745
{
38-
SetDefaultFactory();
46+
return GetServiceProvider(services => Browser, () => RegisterServices(services => Browser));
3947
}
48+
set
49+
{
50+
SetServiceProvider(value);
51+
}
52+
}
4053

41-
Browser = BrowserFactoryContainer.Value.Browser;
54+
/// <summary>
55+
/// Factory for application creation.
56+
/// </summary>
57+
public static IBrowserFactory BrowserFactory
58+
{
59+
get
60+
{
61+
if (!BrowserFactoryContainer.IsValueCreated)
62+
{
63+
SetDefaultFactory();
64+
}
65+
return BrowserFactoryContainer.Value;
66+
}
67+
set
68+
{
69+
BrowserFactoryContainer.Value = value;
70+
}
4271
}
4372

73+
private static IServiceCollection RegisterServices(Func<IServiceProvider, Browser> browserSupplier)
74+
{
75+
var services = new ServiceCollection();
76+
var startup = new Startup();
77+
var settingsFile = startup.GetSettings();
78+
startup.ConfigureServices(services, browserSupplier, settingsFile);
79+
services.AddTransient<IElementFactory, ElementFactory>();
80+
services.AddTransient<CoreElementFactory, ElementFactory>();
81+
services.AddSingleton<ITimeoutConfiguration>(serviceProvider => new TimeoutConfiguration(settingsFile));
82+
services.AddSingleton<CoreTimeoutConfiguration>(serviceProvider => new TimeoutConfiguration(settingsFile));
83+
services.AddSingleton<IBrowserProfile>(serviceProvider => new BrowserProfile(settingsFile));
84+
services.AddSingleton(serviceProvider => new LocalizationManager(serviceProvider.GetRequiredService<ILoggerConfiguration>(), serviceProvider.GetRequiredService<Logger>(), Assembly.GetExecutingAssembly()));
85+
services.AddTransient(serviceProvider => BrowserFactory);
86+
return services;
87+
}
88+
4489
/// <summary>
4590
/// Sets default factory responsible for browser creation.
4691
/// RemoteBrowserFactory if value set in configuration and LocalBrowserFactory otherwise.
4792
/// </summary>
4893
public static void SetDefaultFactory()
4994
{
50-
IConfiguration configuration = Configuration.Instance;
51-
IBrowserFactory browserFactory;
52-
if (configuration.BrowserProfile.IsRemote)
95+
var appProfile = GetRequiredService<IBrowserProfile>();
96+
IBrowserFactory applicationFactory;
97+
if (appProfile.IsRemote)
5398
{
54-
browserFactory = new RemoteBrowserFactory(configuration);
99+
applicationFactory = new RemoteBrowserFactory(ServiceProvider);
55100
}
56101
else
57102
{
58-
browserFactory = new LocalBrowserFactory(configuration);
103+
applicationFactory = new LocalBrowserFactory(ServiceProvider);
59104
}
60-
SetFactory(browserFactory);
105+
106+
BrowserFactory = applicationFactory;
61107
}
62108

63109
/// <summary>
64-
/// Sets custom browser factory.
110+
/// Resolves required service from <see cref="ServiceProvider"/>
65111
/// </summary>
66-
/// <param name="browserFactory">Custom implementation of <see cref="IBrowserFactory"/></param>
67-
public static void SetFactory(IBrowserFactory browserFactory)
112+
/// <typeparam name="T">type of required service</typeparam>
113+
/// <exception cref="InvalidOperationException">Thrown if there is no service of the required type.</exception>
114+
/// <returns></returns>
115+
public static T GetRequiredService<T>()
68116
{
69-
BrowserFactoryContainer.Value = browserFactory;
117+
return ServiceProvider.GetRequiredService<T>();
70118
}
71119
}
72120
}

Aquality.Selenium/src/Aquality.Selenium/Browsers/BrowserNavigation.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Aquality.Selenium.Logging;
1+
using Aquality.Selenium.Core.Localization;
22
using OpenQA.Selenium;
33
using OpenQA.Selenium.Remote;
44
using System;
@@ -17,14 +17,14 @@ internal BrowserNavigation(RemoteWebDriver driver)
1717
this.driver = driver;
1818
}
1919

20-
private Logger Logger => Logger.Instance;
20+
private LocalizationLogger Logger => BrowserManager.GetRequiredService<LocalizationLogger>();
2121

2222
/// <summary>
2323
/// Navigates back.
2424
/// </summary>
2525
public void Back()
2626
{
27-
Logger.InfoLoc("loc.browser.back");
27+
Logger.Info("loc.browser.back");
2828
driver.Navigate().Back();
2929
}
3030

@@ -33,7 +33,7 @@ public void Back()
3333
/// </summary>
3434
public void Forward()
3535
{
36-
Logger.InfoLoc("loc.browser.forward");
36+
Logger.Info("loc.browser.forward");
3737
driver.Navigate().Forward();
3838
}
3939

@@ -62,13 +62,13 @@ public void GoToUrl(Uri url)
6262
/// </summary>
6363
public void Refresh()
6464
{
65-
Logger.InfoLoc("loc.browser.refresh");
65+
Logger.Info("loc.browser.refresh");
6666
driver.Navigate().Refresh();
6767
}
6868

6969
private void InfoLocNavigate(string url)
7070
{
71-
Logger.InfoLoc("loc.browser.navigate", url);
71+
Logger.Info("loc.browser.navigate", url);
7272
}
7373
}
7474
}

Aquality.Selenium/src/Aquality.Selenium/Browsers/JavaScript.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Aquality.Selenium.Utilities;
1+
using Aquality.Selenium.Core.Utilities;
22
using System.Reflection;
33

44
namespace Aquality.Selenium.Browsers

0 commit comments

Comments
 (0)