From 480d2dcc2c8fab22b8de4cd14e710a0aa1de9657 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 23:00:35 +0100 Subject: [PATCH 01/14] Added test pipeline --- .github/workflows/test.yml | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..dc818a3 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,45 @@ +name: UI Tests + +on: + push: + branches: [ main ] + # optionally: + # workflow_dispatch: + +jobs: + selenium-tests: + runs-on: ubuntu-latest + + services: + selenium: + image: selenium/standalone-chromium + ports: + - 4444:4444 + options: >- + --shm-size=2g + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Restore dependencies + run: dotnet restore src/ + + - name: Build solution + run: dotnet build src/ --configuration Release --no-restore + + - name: Run Selenium tests + env: + SELENIUM_HUB_URL: http://localhost:4444/wd/hub + run: dotnet test tests/Berufsschule_HAM.E2ETests/ --logger "trx;LogFileName=test-results.trx" + + - name: Upload test results + uses: actions/upload-artifact@v4 + with: + name: selenium-test-results + path: "**/TestResults/*.trx" \ No newline at end of file From 4497bdc1d56e7dd6cea73f386dcfce3595302cb6 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 23:03:27 +0100 Subject: [PATCH 02/14] test pipeline branch test --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index dc818a3..2fcad95 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: UI Tests on: push: - branches: [ main ] + branches: [ "*" ] # optionally: # workflow_dispatch: From a4b4c010e9473bdeefa3ac989031fa76617b1ba4 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 23:05:32 +0100 Subject: [PATCH 03/14] Commented in headless argument --- tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs index 94ec6fd..1df7f0d 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -49,7 +49,7 @@ public static class AppHelper public static ChromeDriver GetChromeDriver() { var options = new ChromeOptions(); - //options.AddArgument("--headless"); + options.AddArgument("--headless"); return new ChromeDriver(options); } From dc4bced3fba3ad9523cc1f9bee3f21bf429e3852 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 23:10:44 +0100 Subject: [PATCH 04/14] Fixed dotnet snap specific reference --- .github/workflows/test.yml | 2 +- tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2fcad95..bcc2973 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -name: UI Tests +name: E2E Tests on: push: diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs index 1df7f0d..fba1117 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -13,7 +13,7 @@ public static class AppHelper { var startInfo = new ProcessStartInfo { - FileName = "/snap/bin/dotnet", + FileName = "dotnet", Arguments = "run --project ../../../../../src/", WorkingDirectory = AppContext.BaseDirectory, UseShellExecute = false, From 5fc75e712a3978ca605bf8d583ccb9bf25e58e00 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 23:29:07 +0100 Subject: [PATCH 05/14] Added chrome installation to test pipeline --- .github/workflows/test.yml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bcc2973..d04318e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,21 +3,12 @@ name: E2E Tests on: push: branches: [ "*" ] - # optionally: - # workflow_dispatch: + workflow_dispatch: jobs: selenium-tests: runs-on: ubuntu-latest - services: - selenium: - image: selenium/standalone-chromium - ports: - - 4444:4444 - options: >- - --shm-size=2g - steps: - name: Checkout code uses: actions/checkout@v4 @@ -27,6 +18,18 @@ jobs: with: dotnet-version: '8.0.x' + - name: Install Chrome and ChromeDriver + run: | + sudo apt-get update + sudo apt-get install -y chromium-browser chromium-chromedriver + # Symlink to expected locations for Selenium + sudo ln -s /usr/lib/chromium-browser/chromedriver /usr/bin/chromedriver || true + + - name: Verify Chrome install + run: | + chromium-browser --version + chromedriver --version + - name: Restore dependencies run: dotnet restore src/ @@ -35,9 +38,9 @@ jobs: - name: Run Selenium tests env: - SELENIUM_HUB_URL: http://localhost:4444/wd/hub + DOTNET_ENVIRONMENT: Development run: dotnet test tests/Berufsschule_HAM.E2ETests/ --logger "trx;LogFileName=test-results.trx" - + - name: Upload test results uses: actions/upload-artifact@v4 with: From 3b4939ca36d56208a247af3c0ce5fe5a6992926e Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 23:44:24 +0100 Subject: [PATCH 06/14] Fixed chrome not found --- .github/workflows/test.yml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d04318e..c29861f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,9 +21,26 @@ jobs: - name: Install Chrome and ChromeDriver run: | sudo apt-get update - sudo apt-get install -y chromium-browser chromium-chromedriver - # Symlink to expected locations for Selenium - sudo ln -s /usr/lib/chromium-browser/chromedriver /usr/bin/chromedriver || true + sudo apt-get install -y wget gnupg unzip + wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - + echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list + sudo apt-get update + sudo apt-get install -y google-chrome-stable + + # Install matching ChromeDriver + CHROME_VERSION=$(google-chrome --version | grep -oE "[0-9]+\\.[0-9]+\\.[0-9]+") + CHROMEDRIVER_VERSION=$(curl -s "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_$CHROME_VERSION") + if [ -z "$CHROMEDRIVER_VERSION" ]; then + CHROMEDRIVER_VERSION=$(curl -s "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE") + fi + wget -O /tmp/chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/$CHROMEDRIVER_VERSION/linux64/chromedriver-linux64.zip" + unzip /tmp/chromedriver.zip -d /tmp/ + sudo mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver + sudo chmod +x /usr/local/bin/chromedriver + + google-chrome --version + chromedriver --version + - name: Verify Chrome install run: | From 0550261d5ac902215d94ebaf82e9fc6a50353d07 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 9 Nov 2025 23:55:34 +0100 Subject: [PATCH 07/14] Try fix sandboxing and shm usage issues (whatever that means) --- tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs index fba1117..13fd687 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -50,6 +50,8 @@ public static class AppHelper { var options = new ChromeOptions(); options.AddArgument("--headless"); + options.AddArgument("--no-sandbox"); + options.AddArgument("--disable-dev-shm-usage"); return new ChromeDriver(options); } From 53645a4b7e1fe1ad432b05887053cbcc9676d928 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 10 Nov 2025 00:01:54 +0100 Subject: [PATCH 08/14] Try fix test.yml --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c29861f..e07799a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,7 +56,7 @@ jobs: - name: Run Selenium tests env: DOTNET_ENVIRONMENT: Development - run: dotnet test tests/Berufsschule_HAM.E2ETests/ --logger "trx;LogFileName=test-results.trx" + run: dotnet test src - name: Upload test results uses: actions/upload-artifact@v4 From fb15d825d01cadb9591a99c56d089ed398e2ea14 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 10 Nov 2025 00:29:36 +0100 Subject: [PATCH 09/14] Replaced unreliable sleeps with WebDriverWait --- .../Berufsschule_HAM.E2ETests.csproj | 1 + .../Helper/AppHelper.cs | 18 ++++++++++++++++++ .../Helper/GroupsHelper.cs | 7 ++++--- .../Helper/LocationsHelper.cs | 6 +++--- .../Berufsschule_HAM.E2ETests/HomePageTests.cs | 3 ++- .../InventoryPageTests.cs | 16 +++++++--------- 6 files changed, 35 insertions(+), 16 deletions(-) diff --git a/tests/Berufsschule_HAM.E2ETests/Berufsschule_HAM.E2ETests.csproj b/tests/Berufsschule_HAM.E2ETests/Berufsschule_HAM.E2ETests.csproj index 9c10485..c3d5cbc 100644 --- a/tests/Berufsschule_HAM.E2ETests/Berufsschule_HAM.E2ETests.csproj +++ b/tests/Berufsschule_HAM.E2ETests/Berufsschule_HAM.E2ETests.csproj @@ -7,6 +7,7 @@ + diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs index 13fd687..cbecef3 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -2,6 +2,8 @@ using System.Diagnostics; using System.Net; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; +using OpenQA.Selenium.Support.UI; +using SeleniumExtras.WaitHelpers; namespace Berufsschule_HAM.E2ETests.Helper; @@ -9,6 +11,7 @@ public static class AppHelper { public const string ServerUrl = "http://localhost:5275"; public static Uri ServerUri = new(ServerUrl); + public static int DefaultTimeout = 5; public static async Task StartApp(string appUrl) { var startInfo = new ProcessStartInfo @@ -123,4 +126,19 @@ public static class AppHelper throw; } } + + public static void AwaitVisible(ChromeDriver driver, By by) + { + Timeout(driver).Until(ExpectedConditions.ElementIsVisible(by)); + } + + public static WebDriverWait Timeout(ChromeDriver driver, int timeout) + { + return new(driver, TimeSpan.FromSeconds(timeout)); + } + + public static WebDriverWait Timeout(ChromeDriver driver) + { + return new(driver, TimeSpan.FromSeconds(DefaultTimeout)); + } } \ No newline at end of file diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/GroupsHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/GroupsHelper.cs index fdb2079..8c9782c 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/GroupsHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/GroupsHelper.cs @@ -3,6 +3,7 @@ using System.Net; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; +using SeleniumExtras.WaitHelpers; namespace Berufsschule_HAM.E2ETests.Helper; @@ -13,7 +14,7 @@ public static class GroupsHelper NavigateToGroupsPage(driver); IWebElement createGroupButton = driver.FindElement(By.CssSelector("button[data-bs-target=\"#createGroupModal\"]")); createGroupButton.Click(); - Thread.Sleep(500); + AppHelper.AwaitVisible(driver, By.Id("cn")); driver.FindElement(By.Id("cn")).SendKeys(cn); driver.FindElement(By.Id("displayname")).SendKeys(displayName); if (canInventorize) driver.FindElement(By.Id("canInventorize")).Click(); @@ -32,7 +33,7 @@ public static class GroupsHelper NavigateToGroupsPage(driver); IWebElement updateGroupButton = driver.FindElement(By.CssSelector($"button[data-group-id=\"{cn}\"].btn-update")); AppHelper.ScrollIntoViewAndClick(driver, updateGroupButton); - Thread.Sleep(500); + AppHelper.AwaitVisible(driver, By.CssSelector("input#groupId")); var cnInput = driver.FindElement(By.CssSelector("input#groupId")); cnInput.Click(); cnInput.Clear(); @@ -69,7 +70,7 @@ public static class GroupsHelper NavigateToGroupsPage(driver); IWebElement deleteButton = driver.FindElement(By.CssSelector($"button[data-group-id=\"{cn}\"].btn-delete")); AppHelper.ScrollIntoViewAndClick(driver, deleteButton); - Thread.Sleep(1000); + AppHelper.AwaitVisible(driver, By.Id("deleteModal")); driver.FindElement(By.Id("deleteModal")); IWebElement deleteConfirmButton = driver.FindElement(By.CssSelector("#deleteModal .btn-danger")); deleteConfirmButton.Click(); diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs index 6d9f707..666b4de 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/LocationsHelper.cs @@ -13,7 +13,7 @@ public static class LocationsHelper NavigateToLocationsPage(driver); IWebElement createLocationButton = driver.FindElement(By.CssSelector("button[data-bs-target=\"#createModal\"]")); createLocationButton.Click(); - Thread.Sleep(500); + AppHelper.AwaitVisible(driver, By.Id("createLocationName")); driver.FindElement(By.Id("createLocationName")).SendKeys(name); driver.FindElement(By.Id("createRoomNumber")).SendKeys(room); driver.FindElement(By.Id("createSeat")).SendKeys(seat); @@ -28,7 +28,7 @@ public static class LocationsHelper string selector = $"button.btn-warning[data-location-name=\"{name}\"][data-room-number=\"{room}\"][data-seat=\"{seat}\"]"; IWebElement updateLocationButton = driver.FindElement(By.CssSelector(selector)); AppHelper.ScrollIntoViewAndClick(driver, updateLocationButton); - Thread.Sleep(500); + AppHelper.AwaitVisible(driver, By.Id("editLocationName")); List ids = [["editLocationName", newName], ["editRoomNumber", newRoom], ["editSeat", newSeat]]; ids.ForEach(id => { @@ -48,7 +48,7 @@ public static class LocationsHelper NavigateToLocationsPage(driver); IWebElement deleteButton = driver.FindElement(By.CssSelector($"button.btn-danger[data-location-id=\"{cn}\"]")); AppHelper.ScrollIntoViewAndClick(driver, deleteButton); - Thread.Sleep(1000); + AppHelper.AwaitVisible(driver, By.Id("deleteModal")); driver.FindElement(By.Id("deleteModal")); IWebElement deleteConfirmButton = driver.FindElement(By.Id("deleteForm")); deleteConfirmButton.Click(); diff --git a/tests/Berufsschule_HAM.E2ETests/HomePageTests.cs b/tests/Berufsschule_HAM.E2ETests/HomePageTests.cs index 6620a6c..25c6a5a 100644 --- a/tests/Berufsschule_HAM.E2ETests/HomePageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/HomePageTests.cs @@ -1,6 +1,7 @@ using Berufsschule_HAM.E2ETests.Helper; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; +using SeleniumExtras.WaitHelpers; using System.Diagnostics; namespace Berufsschule_HAM.E2ETests; @@ -46,7 +47,7 @@ public class HomePageTests : IDisposable IWebElement logout = _driver.FindElement(By.CssSelector("a[href=\"/Home/Logout\"]")); Assert.True(logout.Displayed); logout.Click(); - Thread.Sleep(250); + AppHelper.Timeout(_driver).Until(ExpectedConditions.UrlContains("/Home/Login")); Assert.Contains("/Home/Login", _driver.Url); } diff --git a/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs b/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs index 48e1d5c..d82bc48 100644 --- a/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/InventoryPageTests.cs @@ -1,6 +1,7 @@ using Berufsschule_HAM.E2ETests.Helper; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; +using SeleniumExtras.WaitHelpers; using System.Diagnostics; namespace Berufsschule_HAM.E2ETests; @@ -41,11 +42,10 @@ public class InventoryPageTests : IDisposable assetIdInputField.SendKeys("1"); IWebElement scanBarcode = _driver.FindElement(By.Id("enterAssetIdManuallyButton")); scanBarcode.Click(); - Thread.Sleep(500); + AppHelper.AwaitVisible(_driver, By.Id("viewAssetModal")); IWebElement viewModal = _driver.FindElement(By.Id("viewAssetModal")); Assert.True(viewModal.Displayed); Assert.True(_driver.FindElement(By.CssSelector("svg[class=\"form-control\"]")).Displayed); - Thread.Sleep(500); Assert.NotEmpty(_driver.FindElement(By.Id("detailName")).GetAttribute("value") ?? ""); Assert.NotEmpty(_driver.FindElement(By.Id("detailLocation")).GetAttribute("value") ?? ""); @@ -71,12 +71,11 @@ public class InventoryPageTests : IDisposable assetIdInputField.SendKeys("1"); IWebElement scanBarcode = _driver.FindElement(By.Id("enterAssetIdManuallyButton")); scanBarcode.Click(); - Thread.Sleep(500); + AppHelper.AwaitVisible(_driver, By.Id("viewAssetModal")); IWebElement viewModal = _driver.FindElement(By.Id("viewAssetModal")); Assert.True(viewModal.Displayed); IWebElement okButton = _driver.FindElement(By.CssSelector("#viewAssetModal button.btn.btn-primary[data-bs-dismiss=\"modal\"]")); okButton.Click(); - Thread.Sleep(500); Assert.True(AppHelper.TryRetryFindSuccessToast(_driver)); } @@ -89,15 +88,14 @@ public class InventoryPageTests : IDisposable assetIdInputField.SendKeys("1"); IWebElement scanBarcode = _driver.FindElement(By.Id("enterAssetIdManuallyButton")); scanBarcode.Click(); - Thread.Sleep(500); + AppHelper.AwaitVisible(_driver, By.Id("viewAssetModal")); IWebElement viewModal = _driver.FindElement(By.Id("viewAssetModal")); Assert.True(viewModal.Displayed); IWebElement updateButton = _driver.FindElement(By.CssSelector("#viewAssetModal button.btn.btn-warning[data-bs-dismiss=\"modal\"]")); updateButton.Click(); - Thread.Sleep(1000); + AppHelper.AwaitVisible(_driver, By.CssSelector("#updateAssetModal button.btn.btn-warning[type=\"submit\"]")); IWebElement okButton = _driver.FindElement(By.CssSelector("#updateAssetModal button.btn.btn-warning[type=\"submit\"]")); okButton.Click(); - Thread.Sleep(500); Assert.True(AppHelper.TryRetryFindSuccessToast(_driver)); } @@ -108,7 +106,7 @@ public class InventoryPageTests : IDisposable _driver.Navigate().GoToUrl(new Uri(serverUri, "/Home/Inventory")); IWebElement link = _driver.FindElement(By.CssSelector("a[href=\"/Home/Assets?CreateModal=true\"]")); link.Click(); - Thread.Sleep(500); + AppHelper.Timeout(_driver).Until(ExpectedConditions.UrlContains("/Home/Assets")); Assert.Contains("/Home/Assets", _driver.Url); } @@ -119,7 +117,7 @@ public class InventoryPageTests : IDisposable _driver.Navigate().GoToUrl(new Uri(serverUri, "/Home/Inventory")); IWebElement openPrintModalButton = _driver.FindElement(By.Id("openPrintModal")); openPrintModalButton.Click(); - Thread.Sleep(500); + AppHelper.AwaitVisible(_driver, By.Id("printModal")); IWebElement printModal = _driver.FindElement(By.Id("printModal")); Assert.True(printModal.Displayed); } From 6e86afe0f2efcf8857a9a8f5b5f529dcdb4d9b10 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 10 Nov 2025 00:40:13 +0100 Subject: [PATCH 10/14] Added window size parameter --- README.md | 1 + tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index d29f80d..c787839 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Berufsschule_HAM ![Build & Publish](https://github.com/LD-Reborn/Berufsschule_HAM/actions/workflows/deploy.yml/badge.svg) +[![E2E Tests](https://github.com/LD-Reborn/Berufsschule_HAM/actions/workflows/test.yml/badge.svg)](https://github.com/LD-Reborn/Berufsschule_HAM/actions/workflows/test.yml) This Project serves the purpose of managing Hardware-Assets diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs index cbecef3..b7e593c 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -55,6 +55,7 @@ public static class AppHelper options.AddArgument("--headless"); options.AddArgument("--no-sandbox"); options.AddArgument("--disable-dev-shm-usage"); + options.AddArgument("--window-size=1920,1080"); return new ChromeDriver(options); } From caa1c7b1704bf2945fa029e2aba1f41a247f12f0 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 10 Nov 2025 00:49:09 +0100 Subject: [PATCH 11/14] Replaced unreliable sleeps in TryRetryFindSuccessToast --- .../Helper/AppHelper.cs | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs index b7e593c..eaacf45 100644 --- a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -74,33 +74,8 @@ public static class AppHelper public static bool TryRetryFindSuccessToast(ChromeDriver driver) { - int retryCounter = 0; - retry: - try - { - - IWebElement successToast = driver.FindElement(By.CssSelector("#toastContainer div.bg-success")); - if (successToast.Displayed) - { - return true; - } - } - catch (Exception) { } - try - { - IWebElement failToast = driver.FindElement(By.CssSelector("#toastContainer div.bg-danger")); - if (failToast.Displayed) - { - return false; - } - } - catch (Exception) { } - if (++retryCounter < 5) - { - Thread.Sleep(250); - goto retry; - } - return false; + Timeout(driver).Until(ExpectedConditions.ElementIsVisible(By.CssSelector("#toastContainer div.bg-success"))); + return true; } public static bool CheckboxGetState(IWebElement webElement) @@ -142,4 +117,9 @@ public static class AppHelper { return new(driver, TimeSpan.FromSeconds(DefaultTimeout)); } + + public static string GetRandomName() + { + return new string([.. Enumerable.Range(0, 8).Select(_ => (char)('a' + new Random().Next(26)))]); + } } \ No newline at end of file From 797db4f07f74e678056e31af226db4d68a867dc6 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 10 Nov 2025 00:49:23 +0100 Subject: [PATCH 12/14] Added randomized names --- tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs | 10 ++++++---- tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs | 8 +++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs b/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs index c280cd6..4942c35 100644 --- a/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/GroupsPageTests.cs @@ -43,12 +43,14 @@ public class GroupsPageTests : IDisposable [Fact] public void GroupsPage_ShouldCreateAndUpdateAndDeleteGroup() { + string randomName = $"RESERVED_TEST_{AppHelper.GetRandomName()}"; + string randomName2 = $"RESERVED_TEST_{AppHelper.GetRandomName()}"; AppHelper.Login(_driver); GroupsHelper.NavigateToGroupsPage(_driver); - GroupsHelper.CreateGroup(_driver, "RESERVED_TEST", "TEST GROUP", true, true, true, true, true, true); - GroupsHelper.UpdateGroup(_driver, "RESERVED_TEST", "RESERVED_TEST2", "TEST GROUP", false, false, false, false, false, false); - GroupsHelper.UpdateGroup(_driver, "RESERVED_TEST2", "RESERVED_TEST", "TEST GROUP", true, true, true, true, true, true); - GroupsHelper.DeleteGroup(_driver, "RESERVED_TEST"); + GroupsHelper.CreateGroup(_driver, randomName, "TEST GROUP", true, true, true, true, true, true); + GroupsHelper.UpdateGroup(_driver, randomName, randomName2, "TEST GROUP", false, false, false, false, false, false); + GroupsHelper.UpdateGroup(_driver, randomName2, randomName, "TEST GROUP", true, true, true, true, true, true); + GroupsHelper.DeleteGroup(_driver, randomName); } public void Dispose() { diff --git a/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs index 4347766..8d25d36 100644 --- a/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs @@ -43,11 +43,13 @@ public class LocationsPageTests : IDisposable [Fact] public void LocationsPage_ShouldCreateAndUpdateAndDeleteGroup() { + string randomName = $"RESERVED_LOCATION_{AppHelper.GetRandomName()}"; + string randomName2 = $"RESERVED_LOCATION_{AppHelper.GetRandomName()}"; AppHelper.Login(_driver); LocationsHelper.NavigateToLocationsPage(_driver); - LocationsHelper.CreateLocation(_driver, "RESERVED_LOCATION", "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); - LocationsHelper.UpdateLocation(_driver, "RESERVED_LOCATION", "RESERVED_ROOM", "RESERVED_ROOMNUMBER", "RESERVED_LOCATION2", "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2"); - LocationsHelper.UpdateLocation(_driver, "RESERVED_LOCATION2", "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2", "RESERVED_LOCATION", "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); + LocationsHelper.CreateLocation(_driver, randomName, "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); + LocationsHelper.UpdateLocation(_driver, randomName, "RESERVED_ROOM", "RESERVED_ROOMNUMBER", randomName2, "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2"); + LocationsHelper.UpdateLocation(_driver, randomName2, "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2", randomName, "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); LocationsHelper.DeleteLocation(_driver, "reservedlocation-reservedroom-reservedroomnumber"); } public void Dispose() From d6731c30360d1e10255a9cd28a13db8882bb91d5 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 10 Nov 2025 00:51:08 +0100 Subject: [PATCH 13/14] Fixed randomized location name not deleted --- tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs index 8d25d36..169ab3b 100644 --- a/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs +++ b/tests/Berufsschule_HAM.E2ETests/LocationsPageTests.cs @@ -50,7 +50,7 @@ public class LocationsPageTests : IDisposable LocationsHelper.CreateLocation(_driver, randomName, "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); LocationsHelper.UpdateLocation(_driver, randomName, "RESERVED_ROOM", "RESERVED_ROOMNUMBER", randomName2, "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2"); LocationsHelper.UpdateLocation(_driver, randomName2, "RESERVED_ROOM2", "RESERVED_ROOMNUMBER2", randomName, "RESERVED_ROOM", "RESERVED_ROOMNUMBER"); - LocationsHelper.DeleteLocation(_driver, "reservedlocation-reservedroom-reservedroomnumber"); + LocationsHelper.DeleteLocation(_driver, $"{randomName.ToLower().Replace("_", "")}-reservedroom-reservedroomnumber"); } public void Dispose() { From 2b1da26ac89514599f2a8fa984917d0101437274 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Mon, 10 Nov 2025 00:56:13 +0100 Subject: [PATCH 14/14] restricted test pipeline to main --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e07799a..7cf1e24 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: E2E Tests on: push: - branches: [ "*" ] + branches: [ "main" ] workflow_dispatch: jobs: