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





Рекомендуется группировать переменные в классы. У вас будет один класс на страницу и вы переместите все переменные для веб-элементов этой страницы в соответствующий класс. Это называется POM или объектной моделью страницы. Вы можете пойти дальше и добавить методы к этим классам, которые охватывают несколько действий для этой конкретной страницы или даже переходы на другие страницы. Подсказка: методы навигации будут перемещаться и ожидать загрузки следующей страницы и возвращать экземпляр класса POM этой целевой страницы.
Итак, вы устанавливаете каждую переменную в верхней части класса? Например, общедоступный статический драйвер IWebDriver = new ChromeDriver();
Предпочтительно, чтобы экземпляр IWebDriver не был частью ваших классов объектов страницы, а был бы синглтоном или передавался в качестве параметра в ваши классы объектов страницы через конструктор. Хороший способ разместить IWebDriver — в базовом классе вашего тестового класса, чтобы вы могли инициализировать его и удалять после каждого теста. Ваши классы Page Object будут содержать ваши селекторы в качестве членов и методов, которые взаимодействуют с элементами страницы через экземпляр драйвера.
Несколько лет назад я написал структуру автоматизации на С# (это оболочка поверх WebDriver), которая ориентирована на объекты страницы. Вы можете увидеть пример теста здесь: github.com/CosminSontu/SpecDrill/blob/master/SpecDrill.Tests/…
Один из подходов заключается в том, что вы можете создать файл свойств и поддерживать в нем все свои 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, но этот вопрос касается С#.
Мне нравится этот подход, я только что попробовал его в классе, и он работает хорошо, но добавление новых переменных было бы более громоздким. Потому что каждый раз, когда вам нужно добавить один, вам нужно будет переключиться на другой файл/класс и добавить его, а затем сослаться на него.
иногда вы можете поддерживать электронную таблицу Excel или текстовый файл и читать их из электронной таблицы Excel или текстового файла. Его будет легко поддерживать, но вам все равно придется писать код/функции для чтения этих файлов или просто манипулировать методами в соответствии с вашими потребностями.
Обычно люди выбирают 2 шаблона:
Раньше я сохранял локаторы элементов в определениях шагов SpecFlow. Это плохо масштабируется для средних и крупных приложений. Объектная модель страницы — это, безусловно, правильный путь.
Я рекомендую использовать фабрику страниц.