DemoBlazeAutomation / POM / BasePage.cs
BasePage.cs
Raw
using Gherkin;
using OpenQA.Selenium;
using OpenQA.Selenium.Interactions;
using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;
using System;
using System.Collections.ObjectModel;
using static DemoBlazeAutomation.POM.BasePage;

namespace DemoBlazeAutomation.POM
{
    public class BasePage
    {
        protected readonly IWebDriver Driver;
        protected WebDriverWait Wait;
        private Actions Action;
        protected IAlert Alert;

        public BasePage(IWebDriver driver)
        {
            Driver = driver;
            Wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); //valor por defecto
            Action = new Actions(driver); // Inicialización del campo action
        }

        protected void SetImplicitWait(int seconds)
        {
            Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(seconds);
        }
        public void NavigateTo(string url)
        {
            Driver.Navigate().GoToUrl(url);
        }


        public void NavigeToForward()
        {
            Driver.Navigate().Forward();
        }

        public void NavigeToBack()
        {
            Driver.Navigate().Back();
        }

        public void NavigeRefresh()
        {
            Driver.Navigate().Refresh();
        }

        public void SubmitElement(IWebElement element)
        {
            element.Submit();
        }

        public string GetTitle()
        {
            return Driver.Title;
        }

        public string GetCurrentUrl()
        {
            return Driver.Url;
        }

        // Método para establecer la espera implícita
        protected void SetImplicitWait(TimeSpan timeSpan)
        {
            Driver.Manage().Timeouts().ImplicitWait = timeSpan;
        }
        public WebDriverWait GetWait(int timeSeconds)
        {
            return new WebDriverWait(Driver, TimeSpan.FromSeconds(timeSeconds));
        }

        public bool GetElementIfCanBeSelected(SelectorType selector, string locator)
        {
            return Wait.Until(ExpectedConditions.ElementToBeSelected(FindElement(selector, locator)));

        }

        public IWebElement GetElementWhenIsClickeable(SelectorType selector, string locator)
        {
            return Wait.Until(ExpectedConditions.ElementToBeClickable(FindElement(selector, locator)));
        }

        public IWebElement GetElementIsVisible(SelectorType selector, string locator)
        {
            return Wait.Until(ExpectedConditions.ElementIsVisible(GetSelector(selector, locator)));
        }
        public IWebElement GetElementWhenExists(By selector)
        {
            return Wait.Until(ExpectedConditions.ElementExists(selector));
        }
        public enum SelectorType
        {
            Id,
            Name,
            ClassName,
            XPath,
            CssSelector,
            TagName,
            LinkText,
            PartialLinkText
        }

        public IWebElement FindElement(SelectorType selector, string locator)
        {
            return Driver.FindElement(GetSelector(selector, locator));
        }

        private By GetSelector(SelectorType selector, string locator)
        {
            switch (selector)
            {
                case SelectorType.Id:
                    return By.Id(locator);
                case SelectorType.Name:
                    return By.Name(locator);
                case SelectorType.ClassName:
                    return By.ClassName(locator);
                case SelectorType.XPath:
                    return By.XPath(locator);
                case SelectorType.CssSelector:
                    return By.CssSelector(locator);
                case SelectorType.TagName:
                    return By.TagName(locator);
                case SelectorType.LinkText:
                    return By.LinkText(locator);
                case SelectorType.PartialLinkText:
                    return By.PartialLinkText(locator);
                default:
                    throw new ArgumentException($"Unsupported selector type: {selector}");
            }
        }

        /// <summary>
        /// Clickea un elemento IWebElement
        /// </summary>
        /// <param name="element"></param>
        public void ClickElement(IWebElement element)
        {
            element.Click();
        }
        /// <summary>
        /// Envia un texto al campo element.
        /// </summary>
        /// <param name="element"></param>
        /// <param name="text"></param>
        public void Write(IWebElement element, string text)
        {
            element.Clear();
            element.SendKeys(text);
        }


        /// <summary>
        /// Envia un texto a un campo el cual debe especificarse el locator, el texto a enviar y la espera en segundos
        /// </summary>
        /// <param name="locator"></param>
        /// <param name="text"></param>
        /// <param name="timeoutInSeconds"></param>
        public void SendKeysWithExplicitWait(By locator, string text, int timeoutInSeconds)
        {
            WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(timeoutInSeconds));
            IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(locator));
            element.SendKeys(text);
        }

        /// <summary>
        /// Envia la cantidad de opciones posibles que tiene un DropDown
        /// </summary>
        /// <param name="element"></param>
        /// <param name="locator"></param>
        /// <returns></returns>
        public int DropdownSize(IWebElement element, String locator)
        {
            SelectElement dropdown = new SelectElement(element);

            IList<IWebElement> dropdownOptions = dropdown.Options;

            return dropdownOptions.Count;
        }

        public enum SelectBy
        {
            Index,
            Value,
            Text
        }

        public void SelectFromDropDownBy(IWebElement element, SelectBy option, string valueToSelect)
        {
            SelectElement dropdown = new SelectElement(element);

            switch (option)
            {
                case SelectBy.Index:
                    dropdown.SelectByIndex(int.Parse(valueToSelect));
                    break;
                case SelectBy.Value:
                    dropdown.SelectByValue(valueToSelect);
                    break;
                case SelectBy.Text:
                    dropdown.SelectByText(valueToSelect);
                    break;
                default:
                    throw new ArgumentException("Opción de selección inválida.");
            }
        }

        /// <summary>
        /// Realiza un hover  sobre un elemento (desplaza el puntero del mouse hasta la posición)
        /// </summary>
        /// <param name="locator"></param>
        public void HoverOverElement(IWebElement locator)
        {
            Action.MoveToElement(locator);
        }

        public void DoubleClick(IWebElement locator)
        {
            Action.DoubleClick(locator);
        }

        public void RightClick(IWebElement locator)
        {
            Action.ContextClick(locator);
        }

        public void DragAndDrop(IWebElement elementA, IWebElement elementB)
        {
            Action.DragAndDrop(elementA, elementB).Build().Perform();
        }

        /// <summary>
        /// Devuelve el string que se encuentra  en la fila "n" y columna "m" , necesita el xpath como primer parametro.
        /// Si devuelve error corroborar que el nro de fila y columna que no exceda el rango.
        /// </summary>
        /// <param name="locator"></param>
        /// Es el string que corresponde al Xpath
        /// <param name="row"></param>
        /// Es el numero de fila
        /// <param name="column"></param>
        /// Es el numero de columna
        /// <returns></returns>
        public string GetValueFromTable(string locator, int row, int column)
        {
            string cellINeed = locator + "/table/tbody/tr[" + row + "]/td[" + column + "]";

            return FindElement(SelectorType.XPath, cellINeed).Text;

        }
        /// <summary>
        /// Escribe un string en la fila n y columna m , que es enviado en el 4to parametro, a una tabla localizada por xpath, 
        /// </summary>
        /// <param name="locator"></param>
        /// Es el string que corresponde al Xpath
        /// <param name="row"></param>
        /// Es el numero de fila
        /// <param name="column"></param>
        /// Es el numero de columna
        /// <param name="stringToSend"></param>
        /// Información a enviar a la tabla
        public void SetValueOnTable(String locator, int row, int column, String stringToSend)
        {
            String cellToFill = locator + "/table/tbody/tr[" + row + "]/td[" + column + "]";

            FindElement(SelectorType.XPath, cellToFill).SendKeys(stringToSend);
        }

      
        public int TotalElementsFromTable(string locatorXPath)
        {
            // Encontrar la tabla utilizando el localizador proporcionado

            IWebElement table = GetElementIsVisible(SelectorType.XPath,locatorXPath);
            

            // Encontrar todos los elementos de fila en la tabla
            ReadOnlyCollection<IWebElement> rows = table.FindElements(By.XPath(".//tbody/tr"));

            // Contar el número de filas en la tabla
            int rowCount = rows.Count;

            return rowCount;
        }

        public void SwitchToDefaultContent()
        {
            Driver.SwitchTo().DefaultContent();
        }
        public void SwitchToiFrame(int iFrameIndex)
        {
            Driver.SwitchTo().Frame(iFrameIndex);
        }

        public void SwitchToParentFrame()
        {
            Driver.SwitchTo().ParentFrame();
        }

        public void SwitchToAlert()
        {
            Driver.SwitchTo().Alert();
        }
        private IAlert GetAlert()
        {
            return Wait.Until(ExpectedConditions.AlertIsPresent());
        }

        public string GetTextAlert()
        {
            return GetAlert().Text;
        }

        public bool StateAlert(bool state)
        {
            return Wait.Until(ExpectedConditions.AlertState(state));
        }

        ///// <summary>
        /////  Se utiliza para descartar o rechazar un cuadro de diálogo de alerta (pop-up)
        ///// </summary>
        public void DismissAlert()
        {
            try
            {
                GetAlert().Dismiss();
            }
            catch (NoAlertPresentException e)
            {
                Console.WriteLine(e.StackTrace);
            }
        }

        public void AcceptAlert()
        {
            try
            {
                GetAlert().Accept();
            }
            catch (NoAlertPresentException e)
            {
                Console.WriteLine(e.StackTrace);
            }
        }


        ///// <summary>
        ///// Se utiliza para notificar la presencia de un alert mediante un booleano
        ///// </summary>
        public bool IsAlertPresent()
        {
            try
            {
                GetAlert(); // Esto verificará si hay un alert presente
                return true;
            }
            catch (WebDriverTimeoutException)
            {
                return false;
            }
        }
        public string MsgFromPlaceHolder(IWebElement element)
        {
            return element.GetAttribute("placeholder");
        }

        public string GetTextFromElement(IWebElement element)
        {
            return element.Text;
        }

        public bool ElementEnabled(IWebElement element)
        {
            return element.Enabled;
        }

        public bool ElementIsDisplayed(IWebElement element)
        {

            return element.Displayed;
        }

        public bool ElementIsSelected(IWebElement element)
        {

            return element.Selected;
        }
        /// <summary>
        /// Retorna todos los WebElements en una lista de elementos, necesita como parametro el className
        /// </summary>
        /// <param name="locator"></param>
        /// <returns></returns>
        public IList<IWebElement> BringMeAllElements(string locatorClassName, SelectorType selectorType = SelectorType.ClassName, int timeSeconds = 5)
        {
            var valor = TimeSpan.FromSeconds(timeSeconds);
            WebDriverWait wait = new WebDriverWait(Driver, valor);
            return wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(GetSelector(selectorType, locatorClassName)));

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="locatorClassName"></param>
        /// <param name="index"></param>
        public void selectNthElementFromList(String locatorClassName, int index)
        {
            IReadOnlyList<IWebElement> list = Driver.FindElements(By.ClassName(locatorClassName));
            list[index].Click();
        }

        /// <summary>
        /// Para seleccionar un elemento de una lista de IWebElements localizada por className, la cual enviaremos como
        /// 2do parametro un string que será utilizado como criterio de busqueda.
        /// </summary>
        /// <param name="locatorClassName"></param>
        /// <param name="criteria"></param>
        public void SelectCriteriaFromList(string locatorClassName, string criteria)
        {
            IReadOnlyList<IWebElement> list = Driver.FindElements(By.ClassName(locatorClassName));
            foreach (IWebElement element in list)
            {
                if (element.Text == criteria)
                {
                    element.Click();
                    break;
                }
            }
        }
    }


}