diff --git a/.github/workflows/TestProjectWorkflow.yml b/.github/workflows/TestProjectWorkflow.yml index a8d43b9..bebe11b 100644 --- a/.github/workflows/TestProjectWorkflow.yml +++ b/.github/workflows/TestProjectWorkflow.yml @@ -22,6 +22,19 @@ jobs: uses: actions/setup-dotnet@v1 with: dotnet-version: '7.0.x' + + - name: Install Chrome dependencies + run: | + sudo apt-get update + sudo apt-get install -y wget unzip xvfb libxi6 libgconf-2-4 + sudo apt-get install -y google-chrome-stable + google-chrome --version + which google-chrome + + - name: Set up display + run: | + export DISPLAY=:99 + Xvfb :99 -ac & - name: Restore dependencies run: dotnet restore diff --git a/TestProject/TestProject/Core/Configuration.cs b/TestProject/TestProject/Core/Configuration.cs index 9290ccf..c51e2ed 100644 --- a/TestProject/TestProject/Core/Configuration.cs +++ b/TestProject/TestProject/Core/Configuration.cs @@ -7,6 +7,7 @@ public class Configuration public static string BrowserType = GetAppSettingsValue("BrowserType", "Chrome"); public static string AppUrl = GetAppSettingsValue("ApplicationUrl", string.Empty); public static string TestDataPath = GetAppSettingsValue("TestDataPath", string.Empty); + public static bool Headless = GetAppSettingsBoolValue("Headless", false); public static string GetAppSettingsValue(string value, string defaultValue) { @@ -18,5 +19,23 @@ public static string GetAppSettingsValue(string value, string defaultValue) return configuration[$"{value}"] ?? defaultValue; } + + private static bool GetAppSettingsBoolValue(string value, bool defaultValue) + { + var builder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); + + IConfigurationRoot configuration = builder.Build(); + + string configValue = configuration[$"{value}"]; + + if (bool.TryParse(configValue, out bool result)) + { + return result; + } + + return defaultValue; + } } } diff --git a/TestProject/TestProject/Core/WebDriver/WebDriverFactory.cs b/TestProject/TestProject/Core/WebDriver/WebDriverFactory.cs index 93ea9a1..6421823 100644 --- a/TestProject/TestProject/Core/WebDriver/WebDriverFactory.cs +++ b/TestProject/TestProject/Core/WebDriver/WebDriverFactory.cs @@ -2,21 +2,38 @@ using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Edge; using OpenQA.Selenium.Firefox; +using TestProject.Core; namespace TestProject.WebDriver { public static class WebDriverFactory { - public static IWebDriver CreateWebDriver(BrowserType browserType) - { + public static IWebDriver CreateWebDriver() + { + /* TODO: @Aleh or @Valiantsina, + * please take a look on this condition, just took browser from configuration, and as out param we are getting enum. + */ + if (!Enum.TryParse(Configuration.BrowserType, true, out BrowserType browserType)) + { + throw new ArgumentException($"Unsupported browser type: {Configuration.BrowserType}"); + } + switch (browserType) { case BrowserType.Chrome: { var service = ChromeDriverService.CreateDefaultService(); - ChromeOptions options = new ChromeOptions(); + ChromeOptions options = new(); + options.AddArgument("--no-sandbox"); options.AddArgument("disable-infobars"); options.AddArgument("--incognito"); + options.AddArgument("--disable-dev-shm-usage"); + + // Add headless run option + if (Configuration.Headless) + { + options.AddArgument("--headless"); + } return new ChromeDriver(service, options, TimeSpan.FromSeconds(30)); } case BrowserType.Edge: @@ -28,10 +45,11 @@ public static IWebDriver CreateWebDriver(BrowserType browserType) } } } + public enum BrowserType { Chrome, Edge, Firefox } -} +} \ No newline at end of file diff --git a/TestProject/TestProject/Core/WebDriver/WebDriverWrapperBrowser.cs b/TestProject/TestProject/Core/WebDriver/WebDriverWrapperBrowser.cs index 286c4dc..7bd6d4c 100644 --- a/TestProject/TestProject/Core/WebDriver/WebDriverWrapperBrowser.cs +++ b/TestProject/TestProject/Core/WebDriver/WebDriverWrapperBrowser.cs @@ -10,9 +10,9 @@ public partial class WebDriverWrapper private const int WaitTimeInSeconds = 10; - public WebDriverWrapper(BrowserType browserType) + public WebDriverWrapper() { - _driver = WebDriverFactory.CreateWebDriver(browserType); + _driver = WebDriverFactory.CreateWebDriver(); _timeout = TimeSpan.FromSeconds(WaitTimeInSeconds); } diff --git a/TestProject/TestProject/TestProject.csproj b/TestProject/TestProject/TestProject.csproj index c96e94b..3ab25fd 100644 --- a/TestProject/TestProject/TestProject.csproj +++ b/TestProject/TestProject/TestProject.csproj @@ -27,7 +27,6 @@ - diff --git a/TestProject/TestProject/Tests/BaseTest.cs b/TestProject/TestProject/Tests/BaseTest.cs index 3c90066..2ba9676 100644 --- a/TestProject/TestProject/Tests/BaseTest.cs +++ b/TestProject/TestProject/Tests/BaseTest.cs @@ -1,7 +1,6 @@ using NUnit.Framework; using TestProject.Core; using TestProject.Core.WebDriver; -using TestProject.WebDriver; namespace TestProject.TestsUI { @@ -13,14 +12,11 @@ public abstract class BaseTest [SetUp] public virtual void SetUp() { - var browserType = (BrowserType)Enum.Parse(typeof(BrowserType), - Configuration.BrowserType); - - WebDriverWrapper = new WebDriverWrapper(browserType); + WebDriverWrapper = new WebDriverWrapper(); WebDriverWrapper.StartBrowser(); WebDriverWrapper.NavigateTo(Configuration.AppUrl); - Logger = Logger ?? new Logger(); + Logger ??= new Logger(); } [TearDown] diff --git a/TestProject/TestProject/appsettings.json b/TestProject/TestProject/appsettings.json index f7c5b09..4d86ade 100644 --- a/TestProject/TestProject/appsettings.json +++ b/TestProject/TestProject/appsettings.json @@ -1,5 +1,6 @@ { "BrowserType": "Chrome", "ApplicationUrl": "https://www.epam.com", - "TestDataPath": "Data\\TestData.json" + "TestDataPath": "Data/TestData.json", + "Headless": true } \ No newline at end of file