Как хранить и перечислять переменные в коде Selenium?

Я создал свои тесты селена, однако я хотел бы начать их очистку для удобства чтения и повторного использования. Что вы делаете со своими переменными?

Я думал о создании своего рода словаря кнопок, которые можно было бы искать, но думаю, что это может вызвать больше проблем, чем решить.

        [Test]
        public static void TestAccrualRuleSet()
        {
            //Setup buttons and variables
            IWebDriver driver = new ChromeDriver();
            var hamburgerMenu = By.XPath("//*[@id='menu-toggle']/span/i");
            var settingsMenuButton = By.XPath("//*[@id='ulAdminNavBar']/li[4]/a");
            var timeAndLaborMgmtButton = By.XPath("//*[@id='ulAdminNavBar']/li[4]/ul/li[11]/a");
            var timeOffTrackingButton = By.XPath("//*[@id='ulAdminNavBar']/li[4]/ul/li[11]/ul/li[2]/a");
            var actionMenu = By.Id("ucAccrualRules_ddlAccrual");
            var ruleNameTextBox = By.Id("ucAccrualRules_ucAccrualRule_txtRuleName");
            var accrualRuleFrequencyDropDown = By.Id("ucAccrualRules_ucAccrualRule_cboAccrualType");
            var dropDownAccrualTypes = By.Id("ucAccrualRules_ucAccrualRule_hourTypes");
            var dropDownAccrualTypesCheckBox1 = By.Id("ucAccrualRules_ucAccrualRule_hourTypes_0");
            var dropDownAccrualTypesCheckBox2 = By.Id("ctl00_ContentPlaceHolder1_ucAccrualRules_ucAccrualRule_hourTypes_1");
            var dropDownAccrualTypesCheckBox3 = By.Id("ctl00_ContentPlaceHolder1_ucAccrualRules_ucAccrualRule_hourTypes_6");
            var maxCarryForwardTextBox = By.Id("ctl00_ContentPlaceHolder1_ucAccrualRules_ucAccrualRule_txtMaxRollover");
            var accrualWaitingTextBox = By.Id("ctl00_ContentPlaceHolder1_ucAccrualRules_ucAccrualRule_txtAccrualWaitingPeriod");
            var saveButton = By.XPath("//*[@id='ctl00_ContentPlaceHolder1_ucAccrualRules_ucAccrualRule_cmdUpdateName']");
            var savedSuccessfully = By.Id("ctl00_ContentPlaceHolder1_ucAccrualRules_ucAccrualRule_UCErrorRuleProperties_lblMessage");
            var propertiesButton = By.Id("ctl00_ContentPlaceHolder1_ucAccrualRules_ucAccrualRule_tpAccuralRulePropertiesnewForms");
            IJavaScriptExecutor js = (IJavaScriptExecutor)driver;

            //Begin test
            AppExtensions.LoginUsingChrome(driver);
            AppExtensions.SelectCompany(driver, "Ren's Test Account");
            System.Threading.Thread.Sleep(1500);
            WebDriverExtensions.Element_Click(driver, hamburgerMenu);
            System.Threading.Thread.Sleep(1500);

Хотя это не весь тест, он показывает вам пример моего огромного списка переменных, которые я использую для хранения кнопок/ссылок, необходимых для выполнения моего теста. Какова наилучшая практика в отношении того, как и где эти переменные хранятся для тестов Selenium?

Я рекомендую использовать фабрику страниц.

Shahboz 11.06.2019 20:13

Создайте файловую структуру, содержащую последовательность выполняемых действий. Я бы разбил каждый «тест» на процедуры и действия. (Как я сделал со своим «браузером»: browsermator.com ) Процедуры соответствуют стандартному повторяемому сценарию или отчету об ошибке. Вся группа процедур будет эквивалентна регрессионному тесту. Зачем писать весь этот код, определяющий переменные, когда вы можете использовать свое приложение для их динамического создания/хранения/загрузки?

pcalkins 12.06.2019 01:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
1 076
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Рекомендуется группировать переменные в классы. У вас будет один класс на страницу и вы переместите все переменные для веб-элементов этой страницы в соответствующий класс. Это называется POM или объектной моделью страницы. Вы можете пойти дальше и добавить методы к этим классам, которые охватывают несколько действий для этой конкретной страницы или даже переходы на другие страницы. Подсказка: методы навигации будут перемещаться и ожидать загрузки следующей страницы и возвращать экземпляр класса POM этой целевой страницы.

Итак, вы устанавливаете каждую переменную в верхней части класса? Например, общедоступный статический драйвер IWebDriver = new ChromeDriver();

J33NO 11.06.2019 18:49

Предпочтительно, чтобы экземпляр IWebDriver не был частью ваших классов объектов страницы, а был бы синглтоном или передавался в качестве параметра в ваши классы объектов страницы через конструктор. Хороший способ разместить IWebDriver — в базовом классе вашего тестового класса, чтобы вы могли инициализировать его и удалять после каждого теста. Ваши классы Page Object будут содержать ваши селекторы в качестве членов и методов, которые взаимодействуют с элементами страницы через экземпляр драйвера.

Cosmin Sontu 12.06.2019 00:07

Несколько лет назад я написал структуру автоматизации на С# (это оболочка поверх WebDriver), которая ориентирована на объекты страницы. Вы можете увидеть пример теста здесь: github.com/CosminSontu/SpecDrill/blob/master/SpecDrill.Tests‌​/…

Cosmin Sontu 12.06.2019 00:10

Один из подходов заключается в том, что вы можете создать файл свойств и поддерживать в нем все свои xpath и т. д. Затем просто обратитесь к файлу свойств в вашем классе, поскольку доступ к переменной должен осуществляться с использованием xpath или локаторов. Таким образом, если какой-либо из xpath изменится, у вас будет только один файл для обновления, это файл свойств. Пример :

    Inside home.properties file you can have xpath as

searchBtn = //input[@elementid = 'abc']

this.properties = new Properties();
InputStream input = new FileInputStream("home.properties");
this.properties.load(input);
//Inside your class file you can access xpath as
    String searchBtn = By.xpath(properties.get("searchButton"))

Я не могу придумать другого подхода.

Это сработает для Java, но этот вопрос касается С#.

Greg Burghardt 11.06.2019 19:40

Мне нравится этот подход, я только что попробовал его в классе, и он работает хорошо, но добавление новых переменных было бы более громоздким. Потому что каждый раз, когда вам нужно добавить один, вам нужно будет переключиться на другой файл/класс и добавить его, а затем сослаться на него.

J33NO 11.06.2019 19:41

иногда вы можете поддерживать электронную таблицу Excel или текстовый файл и читать их из электронной таблицы Excel или текстового файла. Его будет легко поддерживать, но вам все равно придется писать код/функции для чтения этих файлов или просто манипулировать методами в соответствии с вашими потребностями.

Soni K 11.06.2019 19:54

Обычно люди выбирают 2 шаблона:

  1. Репозиторий объектов - для хранения данных элементов во внешнем источнике. В качестве альтернативы вы можете выбрать СпецФлоу и сохранить локаторы элементов в файлах Огурец.
  2. Объектная модель страницы — уровень абстракции пользовательского интерфейса, основная идея — отделить тестовую логику от представления пользовательского интерфейса, чтобы при изменении пользовательского интерфейса тестовый код оставался прежним.

Раньше я сохранял локаторы элементов в определениях шагов SpecFlow. Это плохо масштабируется для средних и крупных приложений. Объектная модель страницы — это, безусловно, правильный путь.

Greg Burghardt 12.06.2019 13:48

Другие вопросы по теме