|
1 | | -using OpenQA.Selenium; |
| 1 | +using OpenQA.Selenium; |
2 | 2 | using OpenQA.Selenium.Chrome; |
3 | 3 | using OpenQA.Selenium.Firefox; |
4 | 4 | using OpenQA.Selenium.Remote; |
5 | 5 | using OpenQA.Selenium.Safari; |
| 6 | +using FluentAssertions; |
6 | 7 |
|
7 | 8 | namespace NUnit_TestingBot_Sample; |
8 | 9 |
|
9 | | -public class ParallelTests |
| 10 | +[TestFixture("chrome", "latest", "Windows 10")] |
| 11 | +[TestFixture("firefox", "latest", "macOS Sequoia")] |
| 12 | +[Parallelizable(ParallelScope.Fixtures)] |
| 13 | +[Category("Parallel")] |
| 14 | +public class ParallelSeleniumTests |
10 | 15 | { |
11 | | - [TestFixture("chrome", "latest", "Windows 10")] |
12 | | - [TestFixture("firefox", "latest", "SONOMA")] |
13 | | - [Parallelizable(ParallelScope.Fixtures)] |
14 | | - public class TbNUnit_ParallelTest |
| 16 | + private IWebDriver? _driver; |
| 17 | + private readonly string _browser; |
| 18 | + private readonly string _version; |
| 19 | + private readonly string _os; |
| 20 | + |
| 21 | + public ParallelSeleniumTests(string browser, string version, string os) |
15 | 22 | { |
16 | | - private IWebDriver driver; |
17 | | - private string browser; |
18 | | - private string version; |
19 | | - private string os; |
| 23 | + _browser = browser; |
| 24 | + _version = version; |
| 25 | + _os = os; |
| 26 | + } |
| 27 | + |
| 28 | + [SetUp] |
| 29 | + public void SetUp() |
| 30 | + { |
| 31 | + var browserOptions = CreateBrowserOptions(); |
| 32 | + var testingBotOptions = CreateTestingBotOptions(); |
| 33 | + |
| 34 | + browserOptions.AddAdditionalOption("tb:options", testingBotOptions); |
20 | 35 |
|
21 | | - public TbNUnit_ParallelTest(String browser, String version, String os) |
| 36 | + _driver = new RemoteWebDriver( |
| 37 | + new Uri("https://hub.testingbot.com/wd/hub"), |
| 38 | + browserOptions.ToCapabilities(), |
| 39 | + TimeSpan.FromSeconds(600)); |
| 40 | + |
| 41 | + _driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10); |
| 42 | + _driver.Manage().Window.Maximize(); |
| 43 | + } |
| 44 | + |
| 45 | + |
| 46 | + [Test] |
| 47 | + [Parallelizable(ParallelScope.Self)] |
| 48 | + public void ShouldHandleSimpleFormInteraction() |
| 49 | + { |
| 50 | + _driver!.Navigate().GoToUrl("https://the-internet.herokuapp.com/login"); |
| 51 | + |
| 52 | + var usernameField = _driver.FindElement(By.Id("username")); |
| 53 | + var passwordField = _driver.FindElement(By.Id("password")); |
| 54 | + var loginButton = _driver.FindElement(By.ClassName("radius")); |
| 55 | + |
| 56 | + usernameField.SendKeys("tomsmith"); |
| 57 | + passwordField.SendKeys("SuperSecretPassword!"); |
| 58 | + loginButton.Click(); |
| 59 | + |
| 60 | + var successMessage = _driver.FindElement(By.CssSelector(".flash.success")); |
| 61 | + successMessage.Text.Should().Contain("You logged into a secure area!"); |
| 62 | + } |
| 63 | + |
| 64 | + [TearDown] |
| 65 | + public void TearDown() |
| 66 | + { |
| 67 | + if (_driver == null) return; |
| 68 | + |
| 69 | + var testPassed = TestContext.CurrentContext.Result.Outcome.Status == |
| 70 | + NUnit.Framework.Interfaces.TestStatus.Passed; |
| 71 | + |
| 72 | + try |
22 | 73 | { |
23 | | - this.browser = browser; |
24 | | - this.version = version; |
25 | | - this.os = os; |
| 74 | + ((IJavaScriptExecutor)_driver).ExecuteScript($"tb:test-result={testPassed.ToString().ToLower()}"); |
26 | 75 | } |
| 76 | + catch (Exception ex) |
| 77 | + { |
| 78 | + TestContext.Out.WriteLine($"Failed to report test result: {ex.Message}"); |
| 79 | + } |
| 80 | + finally |
| 81 | + { |
| 82 | + _driver.Quit(); |
| 83 | + _driver.Dispose(); |
| 84 | + } |
| 85 | + } |
27 | 86 |
|
28 | | - [SetUp] |
29 | | - public void Init() |
| 87 | + private DriverOptions CreateBrowserOptions() |
| 88 | + { |
| 89 | + return _browser.ToLower() switch |
30 | 90 | { |
31 | | - DriverOptions browserOptions; |
32 | | - if (this.browser == "firefox") |
| 91 | + "firefox" => new FirefoxOptions |
33 | 92 | { |
34 | | - browserOptions = new FirefoxOptions() |
35 | | - { |
36 | | - BrowserVersion = this.version, |
37 | | - PlatformName = this.os |
38 | | - }; |
39 | | - } |
40 | | - else if (this.browser == "safari") |
| 93 | + BrowserVersion = _version, |
| 94 | + PlatformName = _os |
| 95 | + }, |
| 96 | + "safari" => new SafariOptions |
41 | 97 | { |
42 | | - browserOptions = new SafariOptions() |
43 | | - { |
44 | | - BrowserVersion = this.version, |
45 | | - PlatformName = this.os |
46 | | - }; |
47 | | - } |
48 | | - else |
| 98 | + BrowserVersion = _version, |
| 99 | + PlatformName = _os |
| 100 | + }, |
| 101 | + _ => new ChromeOptions |
49 | 102 | { |
50 | | - browserOptions = new ChromeOptions() |
51 | | - { |
52 | | - BrowserVersion = this.version, |
53 | | - PlatformName = this.os |
54 | | - }; |
| 103 | + BrowserVersion = _version, |
| 104 | + PlatformName = _os |
55 | 105 | } |
| 106 | + }; |
| 107 | + } |
56 | 108 |
|
57 | | - var tbOptions = new Dictionary<string, string> |
58 | | - { |
59 | | - ["key"] = Environment.GetEnvironmentVariable("TESTINGBOT_KEY"), |
60 | | - ["secret"] = Environment.GetEnvironmentVariable("TESTINGBOT_SECRET"), |
61 | | - ["name"] = TestContext.CurrentContext.Test.Name, |
62 | | - ["selenium-version"] = "3.14.0" |
63 | | - }; |
64 | | - |
65 | | - browserOptions.AddAdditionalOption("tb:options", tbOptions); |
66 | | - |
67 | | - driver = new RemoteWebDriver(new Uri("https://hub.testingbot.com/wd/hub"), browserOptions.ToCapabilities(), TimeSpan.FromSeconds(600)); |
68 | | - } |
| 109 | + private Dictionary<string, object> CreateTestingBotOptions() |
| 110 | + { |
| 111 | + var key = Environment.GetEnvironmentVariable("TESTINGBOT_KEY"); |
| 112 | + var secret = Environment.GetEnvironmentVariable("TESTINGBOT_SECRET"); |
69 | 113 |
|
70 | | - [Test] |
71 | | - public void GoogleTest() |
| 114 | + if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(secret)) |
72 | 115 | { |
73 | | - driver.Navigate().GoToUrl("http://www.google.com"); |
74 | | - Assert.That(driver.Title, Is.EqualTo("Google")); |
75 | | - IWebElement query = driver.FindElement(By.Name("q")); |
76 | | - query.SendKeys("TestingBot"); |
77 | | - query.Submit(); |
| 116 | + throw new InvalidOperationException( |
| 117 | + "TESTINGBOT_KEY and TESTINGBOT_SECRET environment variables must be set"); |
78 | 118 | } |
79 | 119 |
|
80 | | - [TearDown] |
81 | | - public void CleanUp() |
| 120 | + return new Dictionary<string, object> |
82 | 121 | { |
83 | | - bool passed = TestContext.CurrentContext.Result.Outcome.Status == NUnit.Framework.Interfaces.TestStatus.Passed; |
84 | | - try |
85 | | - { |
86 | | - // Logs the result to TestingBot |
87 | | - ((IJavaScriptExecutor)driver).ExecuteScript("tb:test-result=" + (passed ? "passed" : "failed")); |
88 | | - } |
89 | | - finally |
90 | | - { |
91 | | - // Terminates the remote webdriver session |
92 | | - driver.Quit(); |
93 | | - driver.Dispose(); |
94 | | - } |
95 | | - } |
| 122 | + ["key"] = key, |
| 123 | + ["secret"] = secret, |
| 124 | + ["name"] = $"{TestContext.CurrentContext.Test.Name} ({_browser} on {_os})", |
| 125 | + ["selenium-version"] = "4.27.0" |
| 126 | + }; |
96 | 127 | } |
97 | 128 | } |
0 commit comments