【问题标题】:How to store and list out variables in Selenium code?如何在 Selenium 代码中存储和列出变量?
【发布时间】:2019-06-11 15:39:02
【问题描述】:

我已经创建了我的 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 测试,这些变量的存储方式和存储位置的最佳做法是什么?

【问题讨论】:

  • 我推荐使用页面工厂。
  • 创建一个包含要运行的动作序列的文件结构。我会将每个“测试”分解为程序和行动。 (就像我对“浏览器”所做的那样:browsermator.com)这些过程对应于标准的可重复场景或错误报告。整个程序组将等效于回归测试。当您可以使用您的应用程序动态创建/存储/加载它们时,为什么还要编写所有这些定义变量的代码?

标签: c# selenium automation readability


【解决方案1】:

建议您在类中对变量进行分组。您将每页有一个类,并将该页面的 Web 元素的所有变量移动到相应的类中。 这称为 POM 或页面对象模型。 您可以更进一步,向那些涵盖该特定页面的多个操作甚至导航到其他页面的类添加方法。提示:导航方法将导航并等待加载下一页并返回该目标页面的 POM 类的实例。

【讨论】:

  • 那么你是否将每个变量都设置在类的顶部?如 public static IWebDriver driver = new ChromeDriver();
  • 最好 IWebDriver 实例不属于您的页面对象类,而是一个单例或通过构造函数在您的页面对象类中作为参数传递。放置 IWebDriver 的一个好方法是在测试类的基类中,这样您就可以初始化它并在每次测试后将其拆除。您的页面对象类将包含您的选择器作为通过驱动程序实例与页面元素交互的成员和方法。
  • 几年前,我用 c# 编写了一个自动化框架(它是 WebDriver 之上的一个包装器),它对 Page Objects 是固执己见的。您可以在此处查看示例测试:github.com/CosminSontu/SpecDrill/blob/master/SpecDrill.Tests/…
【解决方案2】:

通常人们会选择两种模式:

  1. Object Repository - 将元素数据存储在外部源中。或者,您可以使用 SpecFlow 并将元素定位器保存在 Gherkin 文件中。
  2. Page Object Model - UI 的抽象层,主要思想是将测试逻辑与 UI 表示分离,因此如果 UI 更改,测试代码仍然保持不变

【讨论】:

  • 我实际上曾经将元素定位器保留在 SpecFlow 步骤定义中。这不适用于大中型应用程序。页面对象模型绝对是要走的路。
【解决方案3】:

一种方法是您可以创建一个属性文件并在其中维护所有 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,但这个问题是关于 C# 的。
  • 我喜欢这种方法,我只是在一个类中尝试过,效果很好,但它会使添加新变量更加麻烦。因为每次您需要添加一个时,您都需要切换到另一个文件/类并添加它然后引用它。
  • 有时,您可以维护一个 excel 电子表格或文本文件,并从 excel 电子表格或文本文件中读取它们。它很容易维护,但您仍然需要编写代码/函数来读取这些文件,或者只需操作方法以满足您的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2023-03-31
  • 2016-03-07
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多