diff --git a/EATestFramework/Driver/BrowserDriver.cs b/EATestFramework/Driver/BrowserDriver.cs new file mode 100644 index 0000000..2935d48 --- /dev/null +++ b/EATestFramework/Driver/BrowserDriver.cs @@ -0,0 +1,28 @@ +using OpenQA.Selenium; +using OpenQA.Selenium.Chrome; +using OpenQA.Selenium.Firefox; +using WebDriverManager; +using WebDriverManager.DriverConfigs.Impl; + +namespace EATestFramework.Driver; + +public class BrowserDriver : IBrowserDriver +{ + public IWebDriver GetChromeDriver() + { + new DriverManager().SetUpDriver(new ChromeConfig()); + return new ChromeDriver(); + } + + public IWebDriver GetFirefoxDriver() + { + new DriverManager().SetUpDriver(new FirefoxConfig()); + return new FirefoxDriver(); + } +} + +public enum BrowserType +{ + Chrome, + Firefox +} \ No newline at end of file diff --git a/EATestFramework/Driver/DriverFixture.cs b/EATestFramework/Driver/DriverFixture.cs new file mode 100644 index 0000000..6535b41 --- /dev/null +++ b/EATestFramework/Driver/DriverFixture.cs @@ -0,0 +1,34 @@ +using EATestFramework.Settings; +using OpenQA.Selenium; + +namespace EATestFramework.Driver +{ + + public class DriverFixture : IDriverFixture + { + IWebDriver driver; + private readonly TestSettings _testSettings; + private readonly IBrowserDriver _browserDriver; + + public DriverFixture(TestSettings testSettings, IBrowserDriver browserDriver) + { + _testSettings = testSettings; + _browserDriver = browserDriver; + driver = GetWebDriver(); + + } + + public IWebDriver Driver => driver; + + public IWebDriver GetWebDriver() + { + return _testSettings.BrowserType switch + { + BrowserType.Chrome => _browserDriver.GetChromeDriver(), + BrowserType.Firefox => _browserDriver.GetFirefoxDriver(), + _ => _browserDriver.GetChromeDriver() + }; + } + + } +} diff --git a/EATestFramework/Driver/IBrowserDriver.cs b/EATestFramework/Driver/IBrowserDriver.cs new file mode 100644 index 0000000..20eb5d6 --- /dev/null +++ b/EATestFramework/Driver/IBrowserDriver.cs @@ -0,0 +1,9 @@ +using OpenQA.Selenium; + +namespace EATestFramework.Driver; + +public interface IBrowserDriver +{ + IWebDriver GetChromeDriver(); + IWebDriver GetFirefoxDriver(); +} diff --git a/EATestFramework/Driver/IDriverFixture.cs b/EATestFramework/Driver/IDriverFixture.cs new file mode 100644 index 0000000..2b8ab7f --- /dev/null +++ b/EATestFramework/Driver/IDriverFixture.cs @@ -0,0 +1,10 @@ +using OpenQA.Selenium; + +namespace EATestFramework.Driver +{ + public interface IDriverFixture + { + IWebDriver Driver { get; } + + } +} diff --git a/EATestFramework/Driver/WebDriverInitializerExtension.cs b/EATestFramework/Driver/WebDriverInitializerExtension.cs new file mode 100644 index 0000000..c07690e --- /dev/null +++ b/EATestFramework/Driver/WebDriverInitializerExtension.cs @@ -0,0 +1,19 @@ +using EATestFramework.Settings; +using Microsoft.Extensions.DependencyInjection; + +namespace EATestFramework.Driver; +public static class WebDriverInitializerExtension +{ + public static IServiceCollection UseWebDriverInitializer( + this IServiceCollection services, + BrowserType browserType) + { + services.AddSingleton(new TestSettings + { + BrowserType = browserType + }); + + return services; + } +} + diff --git a/EATestFramework/EATestFramework.csproj b/EATestFramework/EATestFramework.csproj new file mode 100644 index 0000000..30fa7a8 --- /dev/null +++ b/EATestFramework/EATestFramework.csproj @@ -0,0 +1,27 @@ + + + + net6.0 + enable + + false + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + diff --git a/EATestFramework/Settings/TestSettings.cs b/EATestFramework/Settings/TestSettings.cs new file mode 100644 index 0000000..bee7673 --- /dev/null +++ b/EATestFramework/Settings/TestSettings.cs @@ -0,0 +1,9 @@ +using EATestFramework.Driver; + +namespace EATestFramework.Settings +{ + public class TestSettings + { + public BrowserType BrowserType { get; set; } + } +} diff --git a/EATestFramework/Startup.cs b/EATestFramework/Startup.cs new file mode 100644 index 0000000..771a46c --- /dev/null +++ b/EATestFramework/Startup.cs @@ -0,0 +1,15 @@ +using EATestFramework.Driver; +using Microsoft.Extensions.DependencyInjection; + +namespace EATestFramework +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.UseWebDriverInitializer(BrowserType.Firefox); + services.AddScoped(); + services.AddScoped(); + } + } +} diff --git a/EATestProject/EATestProject.csproj b/EATestProject/EATestProject.csproj new file mode 100644 index 0000000..141e5bc --- /dev/null +++ b/EATestProject/EATestProject.csproj @@ -0,0 +1,31 @@ + + + + net6.0 + enable + + false + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/EATestProject/Model/Product.cs b/EATestProject/Model/Product.cs new file mode 100644 index 0000000..e26e9d9 --- /dev/null +++ b/EATestProject/Model/Product.cs @@ -0,0 +1,19 @@ +namespace EATestProject.Model +{ + public class Product + { + public int Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public int Price { get; set; } + public ProductType ProductType { get; set; } + } + + public enum ProductType + { + CPU, + MONITOR, + PERIPHARALS, + EXTERNAL + } +} diff --git a/EATestProject/Pages/CreateProductPage.cs b/EATestProject/Pages/CreateProductPage.cs new file mode 100644 index 0000000..ea40c79 --- /dev/null +++ b/EATestProject/Pages/CreateProductPage.cs @@ -0,0 +1,35 @@ +using EATestFramework.Driver; +using EATestProject.Model; +using OpenQA.Selenium; +using OpenQA.Selenium.Support.UI; + +namespace EATestProject.Pages +{ + public interface ICreateProductPage + { + void EnterProductDetails(Product product); + } + + public class CreateProductPage : ICreateProductPage + { + private readonly IWebDriver _driver; + public CreateProductPage(IDriverFixture driver) => _driver = driver.Driver; + + IWebElement txtName => _driver.FindElement(By.Id("Name")); + IWebElement txtDescription => _driver.FindElement(By.Id("Description")); + IWebElement txtPrice => _driver.FindElement(By.Id("Price")); + IWebElement ddlProductType => _driver.FindElement(By.Id("ProductType")); + IWebElement btnCreate => _driver.FindElement(By.Id("Create")); + + public void EnterProductDetails(Product product) + { + txtName.SendKeys(product.Name); + txtDescription.SendKeys(product.Description); + txtPrice.SendKeys(product.Price.ToString()); + var select = new SelectElement(ddlProductType); + select.SelectByText(product.ProductType.ToString()); + btnCreate.Click(); + } + + } +} diff --git a/EATestProject/Pages/HomePage.cs b/EATestProject/Pages/HomePage.cs new file mode 100644 index 0000000..d530477 --- /dev/null +++ b/EATestProject/Pages/HomePage.cs @@ -0,0 +1,28 @@ +using EATestFramework.Driver; +using OpenQA.Selenium; + +namespace EATestProject.Pages +{ + public interface IHomePage + { + void CreateProduct(); + } + + public class HomePage : IHomePage + { + private readonly IWebDriver _driver; + public HomePage(IDriverFixture driver) + { + _driver = driver.Driver; + } + + IWebElement lnkProduct => _driver.FindElement(By.LinkText("Product")); + IWebElement lnkCreate => _driver.FindElement(By.LinkText("Create")); + + public void CreateProduct() + { + lnkProduct.Click(); + lnkCreate.Click(); + } + } +} diff --git a/EATestProject/Startup.cs b/EATestProject/Startup.cs new file mode 100644 index 0000000..c07eeb9 --- /dev/null +++ b/EATestProject/Startup.cs @@ -0,0 +1,18 @@ +using EATestFramework.Driver; +using EATestProject.Pages; +using Microsoft.Extensions.DependencyInjection; + +namespace EATestProject +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.UseWebDriverInitializer(BrowserType.Firefox); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + } + } +} diff --git a/EATestProject/UnitTest1.cs b/EATestProject/UnitTest1.cs new file mode 100644 index 0000000..b81517f --- /dev/null +++ b/EATestProject/UnitTest1.cs @@ -0,0 +1,43 @@ +using EATestFramework.Driver; +using EATestProject.Model; +using EATestProject.Pages; +using OpenQA.Selenium; +using System; +using Xunit; + +namespace EATestProject +{ + public class UnitTest1: IDisposable + { + private readonly IWebDriver _driver; + private readonly IHomePage _homePage; + private readonly ICreateProductPage _createProductPage; + + public UnitTest1(IDriverFixture driver, IHomePage homePage, ICreateProductPage createProductPage) + { + _homePage = homePage; + _createProductPage = createProductPage; + _driver = driver.Driver; + _driver.Navigate().GoToUrl(new Uri("http://localhost:33084")); + } + + public void Dispose() + { + _driver.Quit(); + } + + [Fact] + public void Test1() + { + + _homePage.CreateProduct(); + _createProductPage.EnterProductDetails(new Product + { + Name = "AutoProduct", + Description = "AutoDescription", + Price = 7675, + ProductType = ProductType.PERIPHARALS + }); + } + } +} \ No newline at end of file diff --git a/SeleniumXunitBasic.sln b/SeleniumXunitBasic.sln new file mode 100644 index 0000000..233836b --- /dev/null +++ b/SeleniumXunitBasic.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EATestFramework", "EATestFramework\EATestFramework.csproj", "{AE40E966-4FE5-4937-B90D-AEE4277936FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EATestProject", "EATestProject\EATestProject.csproj", "{A3565A74-D82B-4B9B-BE5A-9CABE628D163}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AE40E966-4FE5-4937-B90D-AEE4277936FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE40E966-4FE5-4937-B90D-AEE4277936FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE40E966-4FE5-4937-B90D-AEE4277936FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE40E966-4FE5-4937-B90D-AEE4277936FE}.Release|Any CPU.Build.0 = Release|Any CPU + {A3565A74-D82B-4B9B-BE5A-9CABE628D163}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3565A74-D82B-4B9B-BE5A-9CABE628D163}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3565A74-D82B-4B9B-BE5A-9CABE628D163}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3565A74-D82B-4B9B-BE5A-9CABE628D163}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CB3A58BA-7DD8-4FC9-ADE7-09629DC6E361} + EndGlobalSection +EndGlobal