From b686152873ca02fc9ef05262236a611a0d5f79f6 Mon Sep 17 00:00:00 2001
From: Pavel Anihimovsky <47742067+pavelanihimovsky@users.noreply.github.com>
Date: Fri, 30 Aug 2019 12:05:55 +0300
Subject: [PATCH] Fix sonar issues (#140) +semver: minor
* #127 Browse: replace timeout properties setters with methods
* #139 Move docs to wiki
* #127 Fix properties that throw exceptions
---
.../src/Aquality.Selenium/Browsers/Browser.cs | 38 +--
.../Configurations/BrowserProfile.cs | 4 +-
.../Configurations/IBrowserProfile.cs | 10 +-
.../WebDriverSettings/DriverSettings.cs | 4 +-
.../WebDriverSettings/IDriverSettings.cs | 8 +-
.../Waitings/ConditionalWait.cs | 4 +-
.../Integration/BrowserTests.cs | 4 +-
README.md | 6 +-
docs/General.en.md | 284 -----------------
docs/General.ru.md | 294 ------------------
docs/IExplorer_Settings.md | 22 --
11 files changed, 32 insertions(+), 646 deletions(-)
delete mode 100644 docs/General.en.md
delete mode 100644 docs/General.ru.md
delete mode 100644 docs/IExplorer_Settings.md
diff --git a/Aquality.Selenium/src/Aquality.Selenium/Browsers/Browser.cs b/Aquality.Selenium/src/Aquality.Selenium/Browsers/Browser.cs
index 83979c3c..eddb3883 100644
--- a/Aquality.Selenium/src/Aquality.Selenium/Browsers/Browser.cs
+++ b/Aquality.Selenium/src/Aquality.Selenium/Browsers/Browser.cs
@@ -30,9 +30,9 @@ public Browser(RemoteWebDriver webDriver, IConfiguration configuration)
this.configuration = configuration;
Driver = webDriver;
BrowserName = configuration.BrowserProfile.BrowserName;
- ImplicitWaitTimeout = configuration.TimeoutConfiguration.Implicit;
- PageLoadTimeout = configuration.TimeoutConfiguration.PageLoad;
- ScriptTimeout = configuration.TimeoutConfiguration.Script;
+ SetImplicitWaitTimeout(configuration.TimeoutConfiguration.Implicit);
+ SetPageLoadTimeout(configuration.TimeoutConfiguration.PageLoad);
+ SetScriptTimeout(configuration.TimeoutConfiguration.Script);
}
private Logger Logger => Logger.Instance;
@@ -53,15 +53,13 @@ public Browser(RemoteWebDriver webDriver, IConfiguration configuration)
/// Sets Selenium WebDriver ImplicitWait timeout.
/// Default value: .
///
- public TimeSpan ImplicitWaitTimeout
+ /// Desired Implicit wait timeout.
+ public void SetImplicitWaitTimeout(TimeSpan timeout)
{
- set
+ if (!timeout.Equals(implicitWaitTimeout))
{
- if (!value.Equals(implicitWaitTimeout))
- {
- Driver.Manage().Timeouts().ImplicitWait = value;
- implicitWaitTimeout = value;
- }
+ Driver.Manage().Timeouts().ImplicitWait = timeout;
+ implicitWaitTimeout = timeout;
}
}
@@ -70,15 +68,13 @@ public TimeSpan ImplicitWaitTimeout
/// Default value: .
/// Ignored for Safari cause of https://github.com/SeleniumHQ/selenium-google-code-issue-archive/issues/687.
///
- public TimeSpan PageLoadTimeout
+ /// Desired page load timeout.
+ public void SetPageLoadTimeout(TimeSpan timeout)
{
- set
+ if (!configuration.BrowserProfile.BrowserName.Equals(BrowserName.Safari))
{
- if (!configuration.BrowserProfile.BrowserName.Equals(BrowserName.Safari))
- {
- Driver.Manage().Timeouts().PageLoad = value;
- pageLoadTimeout = value;
- }
+ Driver.Manage().Timeouts().PageLoad = timeout;
+ pageLoadTimeout = timeout;
}
}
@@ -86,12 +82,10 @@ public TimeSpan PageLoadTimeout
/// Sets Selenium WebDriver AsynchronousJavaScript timeout.
/// Default value: .
///
- public TimeSpan ScriptTimeout
+ /// Desired AsynchronousJavaScript timeout.
+ public void SetScriptTimeout(TimeSpan timeout)
{
- set
- {
- Driver.Manage().Timeouts().AsynchronousJavaScript = value;
- }
+ Driver.Manage().Timeouts().AsynchronousJavaScript = timeout;
}
///
diff --git a/Aquality.Selenium/src/Aquality.Selenium/Configurations/BrowserProfile.cs b/Aquality.Selenium/src/Aquality.Selenium/Configurations/BrowserProfile.cs
index 22f81a31..31d19bc6 100644
--- a/Aquality.Selenium/src/Aquality.Selenium/Configurations/BrowserProfile.cs
+++ b/Aquality.Selenium/src/Aquality.Selenium/Configurations/BrowserProfile.cs
@@ -21,7 +21,7 @@ public BrowserProfile(JsonFile settingsFile)
this.settingsFile = settingsFile;
}
- public BrowserName BrowserName => (BrowserName) Enum.Parse(typeof(BrowserName), settingsFile.GetValue(".browserName"), ignoreCase: true);
+ public BrowserName BrowserName => (BrowserName)Enum.Parse(typeof(BrowserName), settingsFile.GetValue(".browserName"), ignoreCase: true);
public bool IsElementHighlightEnabled => settingsFile.GetValue(".isElementHighlightEnabled");
@@ -46,7 +46,7 @@ public IDriverSettings DriverSettings
case BrowserName.Safari:
return new SafariSettings(settingsFile);
default:
- throw new ArgumentOutOfRangeException($"There is no assigned behaviour for retrieving driver driversettings for browser {BrowserName}");
+ throw new InvalidOperationException($"There is no assigned behaviour for retrieving DriverSettings for browser {BrowserName}");
}
}
}
diff --git a/Aquality.Selenium/src/Aquality.Selenium/Configurations/IBrowserProfile.cs b/Aquality.Selenium/src/Aquality.Selenium/Configurations/IBrowserProfile.cs
index 215830d8..62a838fa 100644
--- a/Aquality.Selenium/src/Aquality.Selenium/Configurations/IBrowserProfile.cs
+++ b/Aquality.Selenium/src/Aquality.Selenium/Configurations/IBrowserProfile.cs
@@ -12,31 +12,27 @@ public interface IBrowserProfile
///
/// Gets name of target browser.
///
- /// Name of browser.
BrowserName BrowserName { get; }
///
- /// Is remote browser or not.
+ /// Is remote browser or not: true if remote browser and false if local.
///
- /// True if remote browser and false if local.
bool IsRemote { get; }
///
/// Gets remote connection URI is case of remote browser.
///
- /// URI for remote connection.
Uri RemoteConnectionUrl { get; }
///
- /// Is element hightlight enabled or not.
+ /// Is element hightlight enabled or not: true if element highlight is enabled and false otherwise
///
- /// True if element highlight is enabled and false otherwise.
bool IsElementHighlightEnabled { get; }
///
/// Gets driver settings for target browser.
///
- /// Instance of driver settings.
+ /// Thrown when there is no assigned behaviour for retrieving DriverSettings for target browser.
IDriverSettings DriverSettings { get; }
}
}
diff --git a/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/DriverSettings.cs b/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/DriverSettings.cs
index 47fe24ab..f5344d11 100644
--- a/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/DriverSettings.cs
+++ b/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/DriverSettings.cs
@@ -18,7 +18,7 @@ public abstract class DriverSettings : IDriverSettings
/// Instantiates class using JSON file with general settings.
///
/// JSON settings file.
- public DriverSettings(JsonFile settingsFile)
+ protected DriverSettings(JsonFile settingsFile)
{
SettingsFile = settingsFile;
}
@@ -55,7 +55,7 @@ public virtual string DownloadDir
return pathInConfiguration.Contains(".") ? Path.GetFullPath(pathInConfiguration) : pathInConfiguration;
}
- throw new InvalidDataException($"failed to find {DownloadDirCapabilityKey} option in settings profile for {BrowserName}");
+ throw new InvalidOperationException($"Failed to find {DownloadDirCapabilityKey} option in settings profile for {BrowserName}");
}
}
diff --git a/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/IDriverSettings.cs b/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/IDriverSettings.cs
index 5656d5bf..a268a1b1 100644
--- a/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/IDriverSettings.cs
+++ b/Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/IDriverSettings.cs
@@ -11,31 +11,27 @@ public interface IDriverSettings
///
/// Gets version of web driver for WebDriverManager.
///
- /// Target version of web driver.
string WebDriverVersion { get; }
///
- /// Gets system architecture for WebDriverManager.
+ /// Gets target system architecture for WebDriverManager.
///
- /// Target system architecture.
Architecture SystemArchitecture { get; }
///
/// Gets desired options for web driver.
///
- /// Options for web driver.
DriverOptions DriverOptions { get; }
///
/// Gets download directory for web driver.
///
- /// Download directory.
+ /// Thrown when browser settings do not contain capability key.
string DownloadDir { get; }
///
/// Gets web driver capability key for download directory.
///
- /// Capability key.
string DownloadDirCapabilityKey { get; }
}
}
diff --git a/Aquality.Selenium/src/Aquality.Selenium/Waitings/ConditionalWait.cs b/Aquality.Selenium/src/Aquality.Selenium/Waitings/ConditionalWait.cs
index dd643738..aae2f2b4 100644
--- a/Aquality.Selenium/src/Aquality.Selenium/Waitings/ConditionalWait.cs
+++ b/Aquality.Selenium/src/Aquality.Selenium/Waitings/ConditionalWait.cs
@@ -30,7 +30,7 @@ public static class ConditionalWait
/// Throws when timeout exceeded and condition not satisfied.
public static T WaitFor(Func condition, TimeSpan? timeout = null, TimeSpan? pollingInterval = null, string message = null, IList exceptionsToIgnore = null)
{
- BrowserManager.Browser.ImplicitWaitTimeout = TimeSpan.Zero;
+ BrowserManager.Browser.SetImplicitWaitTimeout(TimeSpan.Zero);
var waitTimeout = ResolveConditionTimeout(timeout);
var checkInterval = ResolvePollingInterval(pollingInterval);
var wait = new WebDriverWait(BrowserManager.Browser.Driver, waitTimeout)
@@ -41,7 +41,7 @@ public static T WaitFor(Func condition, TimeSpan? timeout = nu
var ignoreExceptions = exceptionsToIgnore ?? new List { typeof(StaleElementReferenceException) };
wait.IgnoreExceptionTypes(ignoreExceptions.ToArray());
var result = wait.Until(condition);
- BrowserManager.Browser.ImplicitWaitTimeout = Configuration.TimeoutConfiguration.Implicit;
+ BrowserManager.Browser.SetImplicitWaitTimeout(Configuration.TimeoutConfiguration.Implicit);
return result;
}
diff --git a/Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs b/Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs
index 4da98531..4d431c15 100644
--- a/Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs
+++ b/Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs
@@ -83,7 +83,7 @@ public void Should_BePossibleTo_RefreshPage()
public void Should_BePossibleTo_SetPageLoadTimeout()
{
var browser = BrowserManager.Browser;
- browser.PageLoadTimeout = TimeSpan.FromSeconds(1);
+ browser.SetPageLoadTimeout(TimeSpan.FromSeconds(1));
Assert.Throws(() => browser.GoTo("https://github.com/aquality-automation"));
}
@@ -227,7 +227,7 @@ public void Should_BePossibleTo_SetImplicitWait()
var browser = BrowserManager.Browser;
browser.GoTo(new WelcomeForm().Url);
var waitTime = TimeSpan.FromSeconds(5);
- browser.ImplicitWaitTimeout = waitTime;
+ browser.SetImplicitWaitTimeout(waitTime);
var stopwatch = Stopwatch.StartNew();
var elapsedTime = TimeSpan.Zero;
diff --git a/README.md b/README.md
index 9bb4bae0..41ae7292 100644
--- a/README.md
+++ b/README.md
@@ -46,9 +46,9 @@ browser.Quit();
```
### Documentation
-To get more details please look at documentation:
-- [In English](./docs/General.en.md)
-- [In Russian](./docs/General.ru.md)
+To get more details please look at wiki:
+- [In English](https://github.com/aquality-automation/aquality-selenium-dotnet/wiki/Overview-(English))
+- [In Russian](https://github.com/aquality-automation/aquality-selenium-dotnet/wiki/Overview-(Russian))
### License
Library's source code is made available under the [Apache 2.0 license](https://github.com/aquality-automation/aquality-selenium-dotnet/blob/master/LICENSE).
diff --git a/docs/General.en.md b/docs/General.en.md
deleted file mode 100644
index ef6471eb..00000000
--- a/docs/General.en.md
+++ /dev/null
@@ -1,284 +0,0 @@
-# Aquality Selenium for .NET
-
-Aquality Selenium is a wrapper over Selenium WebDriver tool that allows to automate work with web browsers. Selenium WebDriver requires some skill and experience. So, Aquality Selenium suggests simplified and most importantly safer and more stable way to work with Selenium WebDriver.
-
- - 1. PLATFORM SUPPORT
- - 2. CONFIGURATIONS
- - 2.1. SETTINGS
- - 2.2. BROWSER
- - 2.3. DRIVER SETTINGS
- - 2.4. TIMEOUTS
- - 2.5. RETRY POLICY
- - 2.6. LOGGING
- - 2.7. CLOUD USAGE
- - 2.8. ACTIONS HIGHLIGHTING
- - 2.9. ACCESS FROM THE CODE
- - 3. BROWSER
- - 3.1. PARALLEL RUNS
- - 3.2. BROWSER MANAGER
- - 3.3. BROWSER FACTORY
- - 3.4. DRIVER OPTIONS
- - 3.5. DOWNLOAD DIRECTORY
- - 3.6. ALERTS
- - 3.7. SCREENSHOTS
- - 4. ELEMENTS
- - 4.1. ELEMENT FACTORY
- - 4.2. CUSTOM ELEMENTS
- - 4.3. LIST OF ELEMENTS
- - 4.4. STATES OF ELEMENTS
- - 5. FORMS
- - 6. JAVASCRIPT EXECUTION
- - 7. JSON FILE
-
-### 1. PLATFORM SUPPORT
-
-At the moment Aquality Selenium allows to automate web tests for Chrome, Firefox, Safari, IExplorer and Edge. Also you can implement support of new browsers that Selenium supports (more details [here](https://www.seleniumhq.org/about/platforms.jsp)).
-Tests can be executed on any operating system with installed .NET Core SDK 2.1 and higher.
-
-### 2. CONFIGURATIONS
-
-Aquality Selenium provides flexible configuration to run tests by editing [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) file. Most of the settings are clear without further explanation but major points are highlighted below. There is a possibility to implement your own configuration.
-
-### 2.1. SETTINGS
-
-The library uses [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) file or its copies to store all necessary configurations for test runs. By default [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) from dll Embedded Resources is using. If you need to change some options from this file you have to create your own copy of this file in `Resource` folder in your project and change them in this copy. Also you can create several copies of this file with different settings and store in the same folder. The names of the copies should match the following pattern `settings.{profile}.json`. It is useful if you need to run tests on different operating systems, machines, browsers, etc. For example, the Aquality Selenium dev team has two configurations - [settings.json](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Resources/settings.json) and [settings.local.json](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Resources/settings.local.json) - to run tests in Circle CI docker container and on personal infrastructure. To change the settings you can set environment variable with name `profile` and value of desired settings (for example, `local`). By default file with name `settings.json` is using.
-
-Any parameter from [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) also can be overridden through environment variables. You just need to set `jsonPath` to the desired parameter and its value in environment variable: `driverSettings.chrome.webDriverVersion: 77.0.3865.10`.
-
-Settings file contains several sections the purpose of which is described below.
-
-#### 2.2. BROWSER
-
-`browserName` parameter defines the web browser which will be used for test run. For example, `browserName: chrome` means that tests will be run on Google Chrome.
-
-`isRemote` parameter defines whether tests will be run on the same machine where .NET process is running or remote server will be using which is defined in parameter `remoteConnectionUrl`.
-
-#### 2.3. DRIVER SETTINGS
-
-Section `driverSettings` from [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) provides an ability to set up necessary capabilities, options and start arguments for web driver.
-
-Please use official sources from web browser developers to get list of available arguments. For example, for Chrome: [run-chromium-with-flags](https://www.chromium.org/developers/how-tos/run-chromium-with-flags)
-
-[Here](./IExplorer_Settings.md) we tried to described some points of work with IExplorer because of different information in the Internet.
-
-#### 2.4. TIMEOUTS
-
-[settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) contains `timeouts` section which includes a set of parameters related to different timeouts that are using in the library.
-
-All these parameters are using to initialize object of [TimeoutConfiguration](../Aquality.Selenium/src/Aquality.Selenium/Configurations/TimeoutConfiguration.cs) which is accessible throught `Configuration.Instance.TimeoutConfiguration`.
-
-The following are the parameters from `timeouts` section:
-
-- `timeoutImplicit` = 0 seconds - web driver implicit wait timeout [Selenium Implicit Wait](https://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits)
-- `timeoutCondition` = 15 seconds - events with desired conditions timeout. Events include waiting for elements or their state
-- `timeoutScript` = 10 seconds - it is a limit of scripts execution using WebDriver's method **ExecuteAsyncScript**
-- `timeoutPageLoad` = 30 seconds - web page load timeout
-- `timeoutPollingInterval` = 300 milliseconds - polling interval for explicit waits
-- `timeoutCommand` = 60 seconds - maximum timeout of each WebDriver command
-
-As part of the solution, all elements waits are met using Explicit Wait. The use of two wait types (implicit and explicit) is not recommended, as it can lead to incorrect behavior. So, the value of implicit wait will be set to zero forcibly before each explicit wait, regardless of what is in the configuration.
-
-#### 2.5 RETRY POLICY
-
-`retry` section from [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) file is responsible for configuration the number of retries of actions on elements. All the actions such as clicking, typing, ect., can be performed repeatedly in case of exception. The [ElementActionRetrier](../Aquality.Selenium/src/Aquality.Selenium/Utilities/ElementActionRetrier.cs) class which is used for any actions on elements is responsible for this logic.
-
-The `number` parameter means the number of retries of action before exception is thrown.
-
-The `pollingInterval` parameter means the interval in milliseconds between the retries.
-
-The [ElementActionRetrier](../Aquality.Selenium/src/Aquality.Selenium/Utilities/ElementActionRetrier.cs) handles `StaleElementReferenceException` and `InvalidElementStateException` by default and does the retries.
-
-#### 2.6. LOGGING
-
-The solution supports logging of operations (interaction with the browser, page elements). Logging Example:
-
-`2019-07-18 10:14:08 INFO - Label 'First product' :: Moving mouse to element`
-
-Supported languages:
-
-- [en](../Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/en.json) - English
-- [ru](../Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/ru.json) - Russian
-
-The value of logging language is set in the [logger.language](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) parameter.
-
-#### 2.7. CLOUD USAGE
-
-To set up the run on the remote server with Selenium Grid (Selenoid, Zalenium) or on such platforms as BrowserStack, Saucelabs, etc., it is required to set correct value of URL for connection to the service in `remoteConnectionUrl` parameter in [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) file. Also make sure that `isRemote` parameter has value **true**. For example, URL for BrowserStack can be the following [https://USERNAME:AUTOMATE_KEY@hub-cloud.browserstack.com/wd/hub](https://USERNAME:AUTOMATE_KEY@hub-cloud.browserstack.com/wd/hub).
-
-#### 2.8. ACTIONS HIGHLIGHTING
-
-`isElementHighlightEnabled` option is responsible for the need to highlight the elements of the web page with which the work is performed. Enabling the option allows you to more clearly observe the actions of the test.
-
-#### 2.9. ACCESS FROM THE CODE
-
-You can get an access to the settings using instance of [Configuration](../Aquality.Selenium/src/Aquality.Selenium/Configurations/Configuration.cs) class. For example:
-```csharp
-var browserName = Configuration.Instance.BrowserProfile.BrowserName;
-```
-This construction returns value of `browserName` from `settings.json` file.
-
-### **3. BROWSER**
-
-The Browser class is a kind of facade for Selenium WebDriver which contains methods for working with browser window and directly with WebDriver (for example, navigate, maximize, etc.). Writing a test script starts by creating an instance of `Browser` - more on this below.
-
-#### 3.1. PARALLEL RUNS
-
-The solution assumes the existence of only one instance of `Browser` class (has a property of `RemoteWebDriver` type) in the executing thread. Usually tests work with only one instance of browser and this approach is optimal.
-
-If you are working on the task when more than one instance of browser per test is necessary, each browser has to be created in a separate thread. You can find an example of multi-threading usage here: [BrowserConcurrencyTests.cs](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/BrowserConcurrencyTests.cs).
-
-If you are using standard ways of multi-threading from such tools as NUnit, MSTest, etc., every new thread will work with its own instance of `Browser` class.
-
-#### 3.2. BROWSER MANAGER
-
-There are several ways how to initialize `Browser`. The main one is based on the usage of `BrowserManager` class which has static property `Browser`. Below are the options of `BrowserManager` usage.
-
-If you need to get the browser with configuration from settings file you just have to do:
-
-```csharp
-var browser = BrowserManager.Browser;
-```
-
-The first call of `Browser` creates the necessary instance with WebDriver (it opens web browser window, if it is not headless mode). All the following calls in the current thread will work with this instance.
-
-#### 3.3. BROWSER FACTORY
-
-`BrowserManager` uses browser factory to create an instance of `Browser`. There are two implementations of browser factory in the solution:
-
-- [LocalBrowserFactory](../Aquality.Selenium/src/Aquality.Selenium/Browsers/LocalBrowserFactory.cs) - for creating browser in case of `isRemote=false` parameter.
-- [RemoteBrowserFactory](../Aquality.Selenium/src/Aquality.Selenium/Browsers/RemoteBrowserFactory.cs) - for creating browser in case of `isRemote=true` parameter.
-
-Each factory implements `IBrowserFactory` interface which has only one property `Browser`. It allows you to create your own factory. If you want to use your own implementation of browser factory you have to set it in `BrowserManager` using method `SetFactory(IBrowserFactory browserFactory)` before the very first call of `Browser` property. The examples with custom factory can be found in [CustomBrowserFactoryTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/CustomBrowserFactoryTests.cs) class.
-
-If you don't want to use factories you have an option to create an instance of `Browser` by yourself and set it as value of `BrowserManager.Browser` property. `Browser` class has a public constructor `public Browser(RemoteWebDriver webDriver, IConfiguration configuration)`. You can still use existing implementations of `IDriverSettings`, `ITimeoutConfiguration`, ect., during the creation of your own `IConfiguration`.
-
-#### 3.4. DRIVER OPTIONS
-
-Implementation of `IDriverSettings` is using during the creation process of `Browser` and in particular WebDriver. `IDriverSettings` includes property `DriverOptions` which is set to WebDriver during its instantiating. If you use default `BrowserFactory`, the list of options will be created based on the information from [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) file.
-
-You can find the example with user options here: [Should_BePossibleToUse_CustomFactory](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/CustomBrowserFactoryTests.cs).
-
-#### 3.5. DOWNLOAD DIRECTORY
-
-It is often necessary to download files from browser and then perform some actions with them. To get the current download directory you can use property `DownloadDirectory` of `Browser` class.
-
-To support this functionality `IDriverSettings` interface obliges to implement property `string DownloadDir { get; }`. You if use one of the existing `BrowserFactory` you can set download directory in [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) file. For example:
-
-```json
-{
- "download.default_directory": "//home//selenium//downloads"
-}
-```
-
-Please note that key `download.default_directory` is differ for different browser. You can get the name of this key in appropriate classes:
-
-- [ChromeSettings.cs](../Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/ChromeSettings.cs)
-- [FirefoxSettings.cs](../Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/FirefoxSettings.cs)
-- [SafariSettings.cs](../Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/SafariSettings.cs)
-
-At the moment the library supports file downloading only in Chrome, Firefox, Safari browsers.
-
-#### 3.6. ALERTS
-
-`Browser` class provides methods to work with Alerts:
-
-```csharp
-BrowserManager.Browser.HandleAlert(AlertAction.Accept);
-```
-
-You can find more examples in [AlertTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/AlertTests.cs).
-
-#### 3.7. SCREENSHOTS
-
-`Browser` class has the method to get screenshot of web page:
-
-```csharp
-var screenshot = BrowserManager.Browser.GetScreenshot();
-```
-
-For details please see the following test: [Should_BePossibleTo_TakeScreenshot](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs).
-
-### **4. ELEMENTS**
-
-When `Browser` is initialized and desired web page is opened you can start to work with its elements.
-
-#### 4.1. ELEMENT FACTORY
-
-There is an [ElementFactory](../Aquality.Selenium/src/Aquality.Selenium/Elements/ElementFactory.cs) class in the library which is responsible for creating elements of desired type. Below is the example of getting `ITextBox` element:
-
-```csharp
-var elementFactory = new ElementFactory();
-var usernameTextBox = elementFactory.GetTextBox(By.Id("username"), "Username");
-```
-
-Using `ElementFactory` you can create an instance of any class that implements `IElement` interface. There are a set of methods in `ElementFactory` which returns implementations of `IElement` that library has (`IButton`, `ITextBox`, `ICheckBox`, etc.). Please use interfaces as much as possible.
-
-#### 4.2. CUSTOM ELEMENTS
-
-The user is able to create his own element or extend the existing one. `ElementFactory` provides method `T GetCustomElement` for this purpose. You need just to implement `IElement` interface or extend the class of existing element. An example of extension and use can be found in [CustomElementTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/CustomElementTests.cs) class.
-
-#### 4.3. LIST OF ELEMENTS
-
-`ElementFactory` provides method `FindElements` to get the list of desired elements, the usage of which is demonstrated below:
-
-```csharp
-var checkBoxes = elementFactory.FindElements(By.XPath("//*[@class='checkbox']"));
-```
-
-You can find other examples with `ElementFactory` and elements in [Element Tests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Elements).
-
-
-#### 4.4. STATES OF ELEMENTS
-
-Depending on the task you may need to find only Displayed elements on the page or elements which at least exist in the source html (ExistsInAnyState).
-
-To get such elements and work with them methods from `ElementFactory` have optional parameter `state`. For example:
-
-```csharp
-var link = elementFactory.GetLink(By.Id("redirect"), "Link", state: ElementState.Displayed);
-```
-
-The often situation during the work with elements is to check element state or waiting for desired element state. [ElementStateProvider](../Aquality.Selenium/src/Aquality.Selenium/Elements/ElementStateProvider.cs) class helps to do this. Element has `State` property which provides an access to the instance of this class:
-
-```csharp
-UserNameTextBox.State.WaitForEnabled();
-var isDisplayed = UserNameTextBox.State.IsDisplayed;
-```
-
-You can get more examples in [ElementStateTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/ElementStateTests.cs) class.
-
-### **5. FORMS**
-
-The main goal of this library is to help with test automation of web applications. There is a popular practice using [Page Objects](https://github.com/SeleniumHQ/selenium/wiki/PageObjects) approach in test automation. To support and extend this approach solution provides [Form](../Aquality.Selenium/src/Aquality.Selenium/Forms/Form.cs) class which can be used as a parent for all pages and forms of the application under test. Example of usage:
-
-```csharp
-public class SliderForm : Form
-{
- public SliderForm() : base(By.Id("slider_row"), "Slider")
- {
- }
-}
-```
-
-`Id = "slider_row"` is a locator which will be used when checking the opening of the page/form using `IsDisplayed` property from [Form](../Aquality.Selenium/src/Aquality.Selenium/Forms/Form.cs) class.
-
-Example of test with Page Objects: [ShoppingCartTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/ShoppingCartTests.cs).
-
-### **6. JAVASCRIPT EXECUTION**
-
-If you need to execute JavaScript on opened web page you can use one of `ExecuteScript` methods from `Browser` class.
-The solution contains a sufficient amount of most popular JS scripts which are using in test automation. The list of available scripts is represented by [JavaScript](../Aquality.Selenium/src/Aquality.Selenium/Browsers/JavaScript.cs) enum. The scripts are located in resource directory [JavaScripts](../Aquality.Selenium/src/Aquality.Selenium/Resources/JavaScripts).
-The examples of methods usages are defined in [BrowserTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs) class.
-
-There are also an overridden methods to pass JavaScript directly from file or as string in `Browser` class.
-
-### **7. JSON FILE**
-
-Aquality Selenium uses class [JsonFile](../Aquality.Selenium/src/Aquality.Selenium/Utilities/JsonFile.cs) and provides access to it.
-This class provides useful methods to work with JSON files from your project.
-For example, if you want to store web application URL which you are working with as a parameter in configuration, you can get its value from JSON like this:
-
-```csharp
-var environment = new JsonFile("settings.json");
-var url = environment.GetValue(".url");
-```
diff --git a/docs/General.ru.md b/docs/General.ru.md
deleted file mode 100644
index bf8ead5a..00000000
--- a/docs/General.ru.md
+++ /dev/null
@@ -1,294 +0,0 @@
-# Aquality Selenium for .NET
-
-Aquality Selenium является надстройкой над инструментом работы с браузером посредством Selenium WebDriver. Работа с Selenium WebDriver требует определенных навыков и опыта. Aquality Selenium предлагает упрощенный, а главное, более безопасный и стабильный способ работы с Selenium WebDriver.
-
- - 1. PLATFORM SUPPORT
- - 2. CONFIGURATIONS
- - 2.1. SETTINGS
- - 2.2. BROWSER
- - 2.3. DRIVER SETTINGS
- - 2.4. TIMEOUTS
- - 2.5. RETRY POLICY
- - 2.6. LOGGING
- - 2.7. CLOUD USAGE
- - 2.8. ACTIONS HIGHLIGHTING
- - 2.9. ACCESS FROM THE CODE
- - 3. BROWSER
- - 3.1. PARALLEL RUNS
- - 3.2. BROWSER MANAGER
- - 3.3. BROWSER FACTORY
- - 3.4. DRIVER OPTIONS
- - 3.5. DOWNLOAD DIRECTORY
- - 3.6. ALERTS
- - 3.7. SCREENSHOTS
- - 4. ELEMENTS
- - 4.1. ELEMENT FACTORY
- - 4.2. CUSTOM ELEMENTS
- - 4.3. LIST OF ELEMENTS
- - 4.4. STATES OF ELEMENTS
- - 5. FORMS
- - 6. JAVASCRIPT EXECUTION
- - 7. JSON FILE
-
-### 1. PLATFORM SUPPORT
-В настоящее время Aquality Selenium позволяет автоматизировать веб тесты для Chrome, Firefox, Safari, IExplorer и Edge. Также присутствуют возможности самостоятельно реализовать поддержку новых браузеров, которые поддерживаются Selenium (подробнее [здесь](https://www.seleniumhq.org/about/platforms.jsp)).
-При этом запуск тестов может выполняться на любой операционной системе с установленным на ней .NET Core SDK 2.1 и выше.
-
-### 2. CONFIGURATIONS
-
-Aquality Selenium предоставляет пользователю гибкие возможности по конфигурации запусков путём редактирования конфигурационного файла [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json)
-Большинство настроек понятны без дополнительных объяснений, но основные моменты обозначены ниже в данном разделе.
-Также существует возможность использования Aquality Selenium реализовав собственные классы конфигурации.
-
-### 2.1. SETTINGS
-
-Работа с решением подразумевает использование [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) или его измененных копий для запуска тестов. По умолчанию используется файл [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) хранящийся в dll библиотеки как Embedded Resource. Если вам необходимо изменить какие-либо настройки в данном файле, вам необходимо создать такой же файл в директории `Resources` вашего проекта, к которому подключена данная библиотека, и уже в нем изменять необходимые параметы. Также можно создать несколько копий `settings` файла для единовременного хранения нескольких конфигураций, отличающихся какими-либо параметрами. При этом имя должно соответствовать шаблону `settings.{profile}.json`. Cоздавать данные файлы необходимо в той же директории `Resources`. Как правило это удобно, когда есть необходимость выполнять запуск тестов на различных операционных системах, машинах, браузерах и т.п. Например, в настоящее время команда разработчиков Aquality Selenium использует две конфигурации [settings.json](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Resources/settings.json) и [settings.local.json](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Resources/settings.local.json) для выполнения запусков в локальном docker Circle CI и на персональной инфраструктуре.
-Для того, чтобы удобно управлять тем, какой конфигурационный файл необходимо использовать можно установить переменную окружения с именем `profile` и присвоить ей желаемое значение (например, local). По умолчанию во время запусков используется файл с именем `settings.json`.
-
-Любой параметр [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) может быть также переопределен через переменную окружения. Для этого необходимо указать `jsonPath` к параметру в JSON и его значение. Например: `driverSettings.chrome.webDriverVersion: 77.0.3865.10`.
-
-Settings файл содержит несколько секций, назначение которых описывается ниже.
-
-#### 2.2. BROWSER
-`browserName` параметр определяет на каком браузере будет выполняться запуск. Например browser=chrome - означает, что запуск осуществиться в Google Chrome.
-
-`isRemote` параметр определят будет ли запуск выполняться на той же машине, где выполняется .NET процесс или использовать удалённый сервер, указанный в параметре `remoteConnectionUrl`.
-
-#### 2.3. DRIVER SETTINGS
-`driverSettings` секция файла [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) предоставляет возможность устанавливать необходимые capabilities, options или start arguments для web driver.
-
-Для получения допустимых аргументов и опций обратитесь к официальным источникам от разработчиков браузеров. Например, для chrome: [run-chromium-with-flags](https://www.chromium.org/developers/how-tos/run-chromium-with-flags)
-
-Мы постарались [здесь](./IExplorer_Settings.md) описать особенности работы с IExplorer самостоятельно ввиду разрознености информации на этот счёт в интернете.
-
-#### 2.4. TIMEOUTS
-
-[settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) содержит секцию `timeouts`, которая включает в себя набор параметров, связанных с различного рода таймаутами, используемыми в решении.
-
-Все параметры данной конфигурации используются для инициализации объекта класса [TimeoutConfiguration](../Aquality.Selenium/src/Aquality.Selenium/Configurations/TimeoutConfiguration.cs), доступного впоследствии путем обращения `Configuration.Instance.TimeoutConfiguration`.
-
-Ниже приводится описание параметров из секции `timeouts` c их назначением:
-
-- `timeoutImplicit` = 0 секунд - значение неявного ожидания web driver'а [Selenium Implicit Wait](https://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits)
-- `timeoutCondition` = 15 секунд - время ожидания событий в решении. К событиям относятся ожидание элементов или их состояния
-- `timeoutScript` = 10 секунд - данное значение служит лимитом выполнения скриптов с использованием метода WebDriver **ExecuteAsyncScript**
-- `timeoutPageLoad` = 30 секунд - время ожидания загрузки страницы
-- `timeoutPollingInterval` = 300 миллисекунд - интервал опроса в при явных ожиданиях
-- `timeoutCommand` = 60 секунд - максимальное время ожидания выполнения каждой команды, отправляемой web driver'у
-
-В рамках решения все ожидания элементов выполняются при помощи Explicit Wait. Перед ожиданием элемента значение implicit wait будет установлено в ноль принудительно, независимо от того, что находится в конфигурации. Использование двух типов ожиданий не рекомендовано, так как может приводить к некорректному поведению.
-
-#### 2.5 RETRY POLICY
-
-Секция `retry` файла [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) отвечает за конфигурацию количества попыток выполнения операций над элементом. Все операции над элементами (нажатия, ввод текста и т.п.) могут быть выполнены повторно в случае неудачи. Данная логика заложена в классе [ElementActionRetrier](../Aquality.Selenium/src/Aquality.Selenium/Utilities/ElementActionRetrier.cs) посредством которого выполняются любые операции.
-
-Параметр `number` означает количество предпринимаемых попыток выполнить операцию прежде чем выбросить исключение.
-
-Параметр `pollingInterval` означает интервал между попытками в миллисекудах.
-
-[ElementActionRetrier](../Aquality.Selenium/src/Aquality.Selenium/Utilities/ElementActionRetrier.cs) автоматически отлавливает исключения `StaleElementReferenceException` и `InvalidElementStateException` и повторяет попытку снова.
-
-#### 2.6. LOGGING
-
-Решение поддерживает логирование выполняемых операций (взаимодействие с браузером, элементами страницы). Пример логирования:
-
-`2019-07-18 10:14:08 INFO - Label 'First product' :: Moving mouse to element`
-
-Логирование поддерживается на языках:
-
-- [en](../Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/en.json) - Английский
-- [ru](../Aquality.Selenium/src/Aquality.Selenium/Resources/Localization/ru.json) - Русский
-
-Значение языка логирования устанавливается в параметре [logger.language](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json).
-
-#### 2.7. CLOUD USAGE
-
-Для того, чтобы настроить запуск на удалённом сервере Selenium Grid (Selenoid, Zalenium) или на платформах вроде BrowserStack, Saucelabs и т.д., необходимо в конфигурационном файле [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) установить корректное значение URL для подключения к сервису в параметр `remoteConnectionUrl`, а также убедиться, что параметр `isRemote` равен **true**.
-Например, для BrowserStack параметр может иметь вид [https://USERNAME:AUTOMATE_KEY@hub-cloud.browserstack.com/wd/hub](https://USERNAME:AUTOMATE_KEY@hub-cloud.browserstack.com/wd/hub).
-
-#### 2.8. ACTIONS HIGHLIGHTING
-
-`isElementHighlightEnabled` параметр отвечает за необходимость подсветки элементов веб страницы с которыми производится работа. Включение опции позволяет более явно наблюдать за действиями теста.
-
-#### 2.9. ACCESS FROM THE CODE
-
-Доступ к данным из конфигурационного файла обеспечивается посредством обращения к методам экземпляра класса [Configuration](../Aquality.Selenium/src/Aquality.Selenium/Configurations/Configuration.cs). Например:
-```csharp
-var browserName = Configuration.Instance.BrowserProfile.BrowserName;
-```
-Данная конструкция вернёт значение параметра `browserName` из `settings.json` файла.
-
-### **3. BROWSER**
-
-Класс Browser, являющийся своего рода фасадом для Selenium WebDriver и содержит методы работы с окном браузера и непосредственно с WebDriver (например, navigate, maximize window и т.д.). Написание скрипта начинается с создания экземпляра `Browser` - подробнее об этом ниже.
-
-#### 3.1. PARALLEL RUNS
-
-Решение предполагает наличие единственного экземпляра класса `Browser` (содержит поле типа `RemoteWebDriver`) в рамках одного потока исполнения. Как правило тесты работают с одним экземпляром браузера и данный подход оптимален.
-
-Если вы решаете задачу использования в рамках одного теста несколько браузеров, каждый браузер необходимо создавать в отдельном потоке. С примерами работы в многопоточном режиме можно ознакомиться здесь [BrowserConcurrencyTests.cs](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/BrowserConcurrencyTests.cs)
-
-Если вы используете стандартные средства параллелизации, предоставляемые такими инструментами как NUnit, MSTest и т.п., для каждого потока будет автоматически создан свой экземпляр `Browser`.
-
-#### 3.2. BROWSER MANAGER
-
-Существует несколько вариантов инициализации Browser. Основной способ базируется на использовании класса `BrowserManager` и его статического свойства `Browser`. Ниже рассматриваются варианты работы с `BrowserManager`.
-
-Если нам необходимо получить браузер с данными из конфигурационого settings файла то достаточно просто произвести вызов:
-
-```csharp
-var browser = BrowserManager.Browser;
-```
-
-Первый вызов `Browser` создаст необходимый экземпляр с WebDriver (откроется окно браузера, если только не задан headless режим). Все последующие обращения в рамках одного потока будут работать с созданным экземпляром.
-
-#### 3.3. BROWSER FACTORY
-
-Неявно для пользователя `BrowserManager` предоставляет `Browser` посредством обращения к фабрике браузеров. В решение существуют следующие реализации фабрик:
-
-- [LocalBrowserFactory](../Aquality.Selenium/src/Aquality.Selenium/Browsers/LocalBrowserFactory.cs) - для создания браузера в случае использования параметра `isRemote=false`
-- [RemoteBrowserFactory](../Aquality.Selenium/src/Aquality.Selenium/Browsers/RemoteBrowserFactory.cs) - для создания браузера в случае использования параметра `isRemote=true`
-
-Каждая реализация фабрики реализует интерфейс `IBrowserFactory` с единственным свойством `Browser`. Это предоставляет возможность реализовать свою фабрику.
-Чтобы `Browser` возвращала `Browser`, созданный вашей реализацией фабрики, необходимо до первого вызова `Browser` установить в `BrowserManager` свою реализацию фабрики,
-используя метод `SetFactory(IBrowserFactory browserFactory)`.
-Примеры использования собственной фабрики можно рассмотреть здесь [CustomBrowserFactoryTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/CustomBrowserFactoryTests.cs)
-
-Если по каким либо причинам вы решите отказаться от использования фабрик, у вас остается возможность создать экземпляр `Browser` самостоятельно и в дальнейшем установить его в `BrowserManager.Browser`.
-Класс `Browser` содержит публичный конструктор со следующей сигнатурой `public Browser(RemoteWebDriver webDriver, IConfiguration configuration)`.
-При этом, для создания собсвенной реализации `IConfiguration`, вам по-прежнему доступно использование уже имеющиxся реализаций `IDriverSettings`, `ITimeoutConfiguration` и т.д.
-
-#### 3.4. DRIVER OPTIONS
-
-В процессе создания `Browser` и в частности WebDriver используются реализации интерфейса `IDriverSettings`. Реализация включает свойство `DriverOptions`, которые впоследствии устанавливаются в WebDriver при его инициализации.
-Если вы пользуетесь `BrowserFactory` по умолчанию, список options будет сформирован на основании информации в [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json) файле.
-
-Пример с использованием пользовательских options представлен здесь: [Should_BePossibleToUse_CustomFactory](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/CustomBrowserFactoryTests.cs).
-
-#### 3.5. DOWNLOAD DIRECTORY
-
-Не редким случаем является необходимость скачивать файлы в браузере и впоследствии производить с ними работу. Чтобы получить текущую директорию для загрузки можно воспользоваться свойством `DownloadDirectory` экземпляра `Browser`.
-
-Для поддержания этой функциональности интерфейс `IDriverSettings` обязывает реализовать свойство `string DownloadDir { get; }`. Если вы используете одну из уже реализованных `BrowserFactory`, то директорию для загрузки файлов необходимо указать в файле [settings.json](../Aquality.Selenium/src/Aquality.Selenium/Resources/settings.json).
-Например:
-
-```json
-{
- "download.default_directory": "//home//selenium//downloads"
-}
-```
-
-Обратите внимание, что ключ `download.default_directory` отличается для разных браузеров. Изучить какие ключи актуальны для каких браузеров можно в соответствующих классах:
-
-- [ChromeSettings.cs](../Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/ChromeSettings.cs)
-- [FirefoxSettings.cs](../Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/FirefoxSettings.cs)
-- [SafariSettings.cs](../Aquality.Selenium/src/Aquality.Selenium/Configurations/WebDriverSettings/SafariSettings.cs)
-
-В настоящее время решение поддерживает загрузку файлов только в браузерах Chrome, Firefox, Safari.
-
-#### 3.6. ALERTS
-
-Класс `Browser` предоставляет методы работы с Alerts:
-
-```csharp
-BrowserManager.Browser.HandleAlert(AlertAction.Accept);
-```
-
-Больше примеров использования можно найти здесь [AlertTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/AlertTests.cs).
-
-#### 3.7. SCREENSHOTS
-
-Для получения снимков экрана класс `Browser` предоставляет метод
-
-```csharp
-var screenshot = BrowserManager.Browser.GetScreenshot();
-```
-
-Более подробный пример использования смотрите в тесте [Should_BePossibleTo_TakeScreenshot](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs).
-
-### **4. ELEMENTS**
-
-Когда `Browser` инициализирован и осуществлен переход на требуемую страницу можно начинать работу с элементами этой страницы.
-
-#### 4.1. ELEMENT FACTORY
-
-Решение включает класс [ElementFactory](../Aquality.Selenium/src/Aquality.Selenium/Elements/ElementFactory.cs), который отвечает за создание элемента необходимого типа. Ниже приводится пример получения `ITextBox`:
-
-```csharp
-var elementFactory = new ElementFactory();
-var usernameTextBox = elementFactory.GetTextBox(By.Id("username"), "Username");
-```
-
-`ElementFactory` способна создавать объекты любых классов, реализующих интерфейс `IElement`.
-`ElementFactory` содержит ряд методов, которые возвращают реализации `IElement`, имеющиеся по умолчанию в решении (`IButton`, `ITextBox`, `ICheckBox` и т.д.). Обратите внимание, что работа с элементами ведется через интерфейсы, чтобы пользователь обращал внимание только на функциональность, но не на реализацию.
-
-#### 4.2. CUSTOM ELEMENTS
-
-Пользователь имеет возможность создать свой элемент или расширить имеющийся по умолчанию. Для этих целей `ElementFactory` предоставляет метод `T GetCustomElement`. Достаточно лишь реализовать `IElement` интерфейс или расширить имеющийся класс элемента. С примером расширения и последующего использования можно ознакомиться в классе [CustomElementTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/CustomElementTests.cs).
-
-#### 4.3. LIST OF ELEMENTS
-
-Для получения списка элементов `ElementFactory` предоставляет метод `FindElements`, использование которого демонстрируется ниже:
-
-```csharp
-var checkBoxes = elementFactory.FindElements(By.XPath("//*[@class='checkbox']"));
-```
-
-С другими примерами работы с `ElementFactory` и элементами можно ознакомиться здесь [Element Tests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Elements).
-
-
-#### 4.4. STATES OF ELEMENTS
-
-При работе с элементами страницы в зависимости от задачи как правило ожидается либо только нахождение элемента который виден на странице (Displayed), либо который хотя бы присутствует в верстке (Exists in any state).
-
-Для получения и последующей работы с данными типами элементов методы `ElementFactory` имеют опциональный параметр `state`. Например,
-
-```csharp
-var link = elementFactory.GetLink(By.Id("redirect"), "Link", state: ElementState.Displayed);
-```
-
-При работе с элементами частой является ситуация проверки состояния элемента или ожидание желаемого состояния.
-Данная функциональность реализуется посредством класса [ElementStateProvider](../Aquality.Selenium/src/Aquality.Selenium/Elements/ElementStateProvider.cs). Доступ к экземпляру этого класса можно получить посредством свойства `State` у элемента:
-
-```csharp
-UserNameTextBox.State.WaitForEnabled();
-var isDisplayed = UserNameTextBox.State.IsDisplayed;
-```
-
-Больше примеров можно увидеть в классе [ElementStateTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/ElementStateTests.cs).
-
-### **5. FORMS**
-
-Основное назначение решения - помощь в автоматизации тестирования Web приложений. Существует практика автоматизации с использованием подхода [Page Objects](https://github.com/SeleniumHQ/selenium/wiki/PageObjects). Для поддержания и расширения данного подхода решение предлагает к использованию класс [Form](../Aquality.Selenium/src/Aquality.Selenium/Forms/Form.cs), который может служить родительским классом для всех описываемых страниц и форм приложения. Пример использования:
-
-```csharp
-public class SliderForm : Form
-{
- public SliderForm() : base(By.Id("slider_row"), "Slider")
- {
- }
-}
-```
-
-Здесь `Id = "slider_row"` устанавливает локатор, который будет использован при проверке открытия страницы/формы, используя свойство `IsDisplayed` класса [Form](../Aquality.Selenium/src/Aquality.Selenium/Forms/Form.cs).
-
-Пример теста с использованием Page Objects здесь [ShoppingCartTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/Usecases/ShoppingCartTests.cs).
-
-### **6. JAVASCRIPT EXECUTION**
-
-При необходимости выполнить какой либо JavaScript на открытой странице можно воспользоваться одним из методов `ExecuteScript` класса `Browser`.
-Решение содержит достаточное количество наиболее используемых скриптов при выполнении автоматизации тестирования. Список скриптов представлен перечислением JavaScript. Сами скрипты расположены в директории ресурсов [JavaScripts](../Aquality.Selenium/src/Aquality.Selenium/Resources/JavaScripts).
-Примеры использования метода имеются в классе [BrowserTests](../Aquality.Selenium/tests/Aquality.Selenium.Tests/Integration/BrowserTests.cs).
-
-Также существует перегрузка для передачи файла с JavaScript или непосредственно строки со скриптом.
-
-### **7. JSON FILE**
-
-Aquality Selenium использует для своей работы и предоставляет доступ к классу [JsonFile](../Aquality.Selenium/src/Aquality.Selenium/Utilities/JsonFile.cs).
-Данный класс предоставляет удобные методы для работы с JSON файлами вашего проекта.
-Например, если вы захотите хранить URL сайта с которым вы работаете как параметр конфигурации вы сможете считывать значения из JSON при помощи указанного класса:
-
-```csharp
-var environment = new JsonFile("settings.json");
-var url = environment.GetValue(".url");
-```
diff --git a/docs/IExplorer_Settings.md b/docs/IExplorer_Settings.md
deleted file mode 100644
index 004aa768..00000000
--- a/docs/IExplorer_Settings.md
+++ /dev/null
@@ -1,22 +0,0 @@
-## IE requirements to start and use browser via selenium webdriver:
-
-1. In IE Internet options -> Security, all Zones (Internet - Local - Trusted) must have the same protection level.
-Also Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.
-
-2. For IE 11 only, you will need to set a registry entry on the target computer so that
-the driver can maintain a connection to the instance of Internet Explorer it creates.
-For 32-bit Windows installations, the key you must examine in the registry editor is
-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE.
-For 64-bit Windows installations, the key is HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet
-Explorer\Main\FeatureControl\FEATURE_BFCACHE. Please note that the FEATURE_BFCACHE
-subkey may or may not be present, and should be created if it is not present. Important:
-Inside this key, create a DWORD value named iexplore.exe with the value of 0.
-
-Here you need to specify DWORD value named iexplore.exe with the value of 0 has to
-be set both for 64-bit and 32-bit Windows.
-
-3. If you see the warning message like this: "WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5."
-You may have to create a key named "Prefs" at registry path HKEY_LOCAL_MACHINE\Software\JavaSoft and/or HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
-
-4. In some cases popup for saving password can disturb test execution. We recommended to disable it.
-You can do this via Internet options -> Content -> Settings (in the AutoComplete section) -> uncheck the "Ask me before saving passwords" and "User names and passwords on forms"
\ No newline at end of file