using ESuite.UI.E2E.Pages; using OpenQA.Selenium; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; namespace ESuite.UI.E2E.Helpers { public static class I { private readonly static ConfigHelper configHelper = new(); private readonly static int TimeToWait = configHelper.ClickWaitSeconds; public static void Click(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); IWebElement? element = WaitForElementVisibleAndClickable(locator, (int)waitTimeInSeconds, driver) ?? throw new NoSuchElementException($"Element with locator '{locator}' was not found."); try { element.Click(); } catch (Exception) { IWebElement? newPositionElement = WaitForElementVisibleAndClickable(locator, (int)waitTimeInSeconds, driver); newPositionElement!.Click(); } } public static void RefreshPage(IWebDriver? driver = null) { driver ??= WebDriverHelper.GetWebDriver(); driver!.Navigate().Refresh(); } public static IWebElement? WaitForVisible(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); return Retry((int)waitTimeInSeconds, () => { return wait.Until(ExpectedConditions.ElementIsVisible(locator)); }); } private static T Retry(int waitTimeInSeconds, Func func) { var expire = DateTime.Now.AddSeconds((int)waitTimeInSeconds); Exception? exception = null; while (DateTime.Now < expire) { try { return func(); } catch (Exception e) { exception = e; } } throw new Exception("Retry failed", exception); } private static void Retry(int waitTimeInSeconds, Action func) { var expire = DateTime.Now.AddSeconds((int)waitTimeInSeconds); Exception? exception = null; while (DateTime.Now < expire) { try { func(); exception = null; break; } catch (Exception e) { exception = e; } } if (exception != null) { throw new Exception("Retry failed", exception); } } public static IWebElement? WaitForElementVisibleAndClickable(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); return Retry((int)waitTimeInSeconds, () => { WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); try { wait.Until(ExpectedConditions.ElementIsVisible(locator)); return wait.Until(ExpectedConditions.ElementToBeClickable(locator)); } catch (StaleElementReferenceException) { throw; } catch (NoSuchElementException) { return null; } }); } public static IWebElement? WaitToBeClickable(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); return Retry((int)waitTimeInSeconds, () => { try { return wait.Until(ExpectedConditions.ElementToBeClickable(locator)); } catch (StaleElementReferenceException) { throw; } catch (NoSuchElementException) { return null; } }); } public static bool WaitTillInvisible(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); try { return wait.Until(ExpectedConditions.InvisibilityOfElementLocated(locator)); } catch (NoSuchElementException) { return false; } } public static void FillField(By locator, string text, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); IWebElement? element = WaitToBeClickable(locator, (int)waitTimeInSeconds, driver); if (element != null) { element.Clear(); DebounceDelay(300); element.SendKeys(text); if (element.TagName.Equals("input", StringComparison.CurrentCultureIgnoreCase)) { WaitForElementWithAttributeValue(locator, "value", text); } } else { throw new InvalidOperationException($"There is not input field with locator: {locator}"); } } public static void WaitForElementWithAttributeValue(By locator, string attributeName, string expectedValue, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); try { wait.Until(driver => { var element = driver.FindElement(locator); var actualValue = element.GetAttribute(attributeName); return actualValue == expectedValue; }); } catch (WebDriverTimeoutException) { throw new TimeoutException($"Element with locator '{locator}', attribute '{attributeName}' and expected value '{expectedValue}' was not found!"); } } public static void WaitForOptionToBePresentInSelect(By selectLocator, string optionText, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); BasicPage basicPage = new(driver); WaitTillInvisible(BasicPage.LoadingDropdownMessage); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); wait.Until(driver => { var selectElement = driver.FindElement(selectLocator); var option = selectElement.FindElements(By.XPath($"./option[text()='{optionText}']")); return option.Count > 0; }); } public static void SelectOption(By locator, object option, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); string? optionString = option.ToString(); Retry((int)waitTimeInSeconds, () => { IWebElement? element = WaitForElementVisibleAndClickable(locator, (int)waitTimeInSeconds, driver); WaitForOptionToBePresentInSelect(locator, optionString!); try { SelectElement select = new(element!); select.SelectByText(optionString!); } catch (StaleElementReferenceException) { throw; } catch (Exception e) { throw new NoSuchElementException($"Option '{option}' was not found. Exception: {e.Message}"); } }); } public static string GetText(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { try { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); IWebElement? element = WaitForElementVisibleAndClickable(locator, (int)waitTimeInSeconds, driver); return element!.Text; } catch (NoSuchElementException) { throw new NoSuchElementException($"I can't find the text for a non-existent locator: {locator}"); } } public static bool CheckIfTextInChildElements(By locator, string searchText, IWebDriver? driver = null) { driver ??= WebDriverHelper.GetWebDriver(); IWebElement? parentElement = driver!.FindElement(locator); IReadOnlyCollection childElements = parentElement.FindElements(By.XPath(".//*")); foreach (IWebElement child in childElements) { if (child.Text.Contains(searchText)) return true; } return false; } public static bool CheckIfTextIs(By locator, string searchText, IWebDriver? driver = null) { driver ??= WebDriverHelper.GetWebDriver(); IWebElement? element = driver!.FindElement(locator); if (element.Text.Contains(searchText)) return true; return false; } public static string GetValueAttribute(By locator, int? waitTimeInSeconds = null, string? attributeName = "value", IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); IWebElement? element = WaitForVisible(locator, (int)waitTimeInSeconds, driver); return element!.GetAttribute(attributeName!)!; } public static string GetTextFromElement(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { try { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); IWebElement? element = WaitForElementVisibleAndClickable(locator, (int)waitTimeInSeconds, driver); return element!.Text; } catch (NoSuchElementException) { throw new NoSuchElementException($"I can't find elements for a non-existent locator: {locator}"); } } public static IList GetTextsFromElements(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { try { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WaitForElementVisibleAndClickable(locator, (int)waitTimeInSeconds, driver); var elements = driver.FindElements(locator); IList texts = []; foreach (var element in elements) { texts.Add(element.Text); } return texts; } catch (NoSuchElementException) { throw new NoSuchElementException($"I can't find elements for a non-existent locator: {locator}"); } } public static int CountElementsOnPage(By locator, IWebDriver? driver = null) { driver ??= WebDriverHelper.GetWebDriver(); System.Collections.ObjectModel.ReadOnlyCollection webElements = driver.FindElements(locator); return ((IReadOnlyCollection)webElements).Count; } public static bool IsVisibleNumberOfElements(By locator, int numberOfElements, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); try { return wait.Until(drv => drv.FindElements(locator).Count == numberOfElements); } catch (WebDriverTimeoutException) { return false; } } /// /// Delays the execution for the specified amount of time in milliseconds. /// /// The time to wait. public static void DebounceDelay(int time) { Thread.Sleep(time); } public static void WaitForPageToLoad(int? waitTimeInSeconds = null, IWebDriver? driver = null) { driver ??= WebDriverHelper.GetWebDriver(); waitTimeInSeconds ??= TimeToWait; WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); wait.Until(driver => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState")!.Equals("complete")); } public static void NavigateToURL(string url, IWebDriver? driver = null) { driver ??= WebDriverHelper.GetWebDriver(); driver.Navigate().GoToUrl(url); WaitForPageToLoad(); } public static bool WaitForElementToBeChecked(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); try { return wait.Until(ExpectedConditions.ElementToBeSelected(locator)); } catch (Exception) { return false; } } public static String? ReturnSelectedOption(By locator, int? waitTimeInSeconds = null, IWebDriver? driver = null) { waitTimeInSeconds ??= TimeToWait; driver ??= WebDriverHelper.GetWebDriver(); WebDriverWait wait = new(driver, TimeSpan.FromSeconds((int)waitTimeInSeconds)); try { return wait.Until(driver => { IWebElement selectElement = driver.FindElement(locator); SelectElement select = new(selectElement); string selectedText = select.SelectedOption.Text; return selectedText; }); } catch (WebDriverTimeoutException) { return null; throw new TimeoutException($"Element with locator '{locator}' was not found!"); } } } }