C# 如何在Selenium代码中存储和列出变量?

C# 如何在Selenium代码中存储和列出变量?,c#,selenium,automation,readability,C#,Selenium,Automation,Readability,我已经创建了我的selenium测试,但是我想开始清理它们以便于可读性和重用。如何处理变量 我曾考虑过建立一些按钮字典,可以查找,但我认为这可能会导致更多的问题,而不是解决问题 [Test] public static void TestAccrualRuleSet() { //Setup buttons and variables IWebDriver driver = new ChromeDriv

我已经创建了我的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测试,最佳做法是什么?

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

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

一种方法是您可以创建一个属性文件并在其中维护所有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"))

我想不出另一种方法。

一种方法是您可以创建一个属性文件并在其中维护所有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"))

我想不出另一种方法。

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

  • -将元素数据存储在外部源中。或者,您可以在文件中查找并保留图元定位器
  • -UI的抽象层,主要思想是将测试逻辑从UI表示中分离出来,这样,如果UI发生更改,测试代码仍然保持不变

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

  • -将元素数据存储在外部源中。或者,您可以在文件中查找并保留图元定位器
  • -UI的抽象层,主要思想是将测试逻辑从UI表示中分离出来,这样,如果UI发生更改,测试代码仍然保持不变

  • 那么您是否将每个变量都设置在类的顶部?例如公共静态IWebDriver driver=new ChromeDriver();IWebDriver实例最好不是页面对象类的一部分,而是一个单例或通过构造函数在页面对象类中作为参数传递。放置IWebDriver的一个好方法是在测试类的基类中,这样您就可以初始化它,并在每次测试后将其拆下。您的页面对象类将包含选择器作为成员以及通过驱动程序实例与页面元素交互的方法。几年前,我用c#(即WebDriver顶部的包装器)编写了一个自动化框架,该框架在页面对象上是自以为是的。您可以在这里看到一个示例测试:那么您是否将每个变量都设置在类的顶部?例如公共静态IWebDriver driver=new ChromeDriver();IWebDriver实例最好不是页面对象类的一部分,而是一个单例或通过构造函数在页面对象类中作为参数传递。放置IWebDriver的一个好方法是在测试类的基类中,这样您就可以初始化它,并在每次测试后将其拆下。您的页面对象类将包含选择器作为成员以及通过驱动程序实例与页面元素交互的方法。几年前,我用c#(即WebDriver顶部的包装器)编写了一个自动化框架,该框架在页面对象上是自以为是的。您可以在这里看到一个示例测试:这对Java有效,但这个问题是关于C的。我喜欢这种方法,我只是在类中尝试了它,效果很好,但它会使添加新变量变得更麻烦。因为每次需要添加时,都需要切换到另一个文件/类并添加它,然后引用它。有时,您可以维护excel电子表格或文本文件,并从excel电子表格或文本文件中读取这些文件。这将很容易维护,但您仍然需要编写代码/函数来读取这些文件,或者只是操作方法来满足您的需要。这对Java来说是可行的,但这个问题是关于C#。我喜欢这种方法,我只是在类中尝试过,效果很好,但它会使添加新变量变得更麻烦。因为每次需要添加时,都需要切换到另一个文件/类并添加它,然后引用它。有时,您可以维护excel电子表格或文本文件,并从excel电子表格或文本文件中读取这些文件。这将很容易维护,但您仍然需要编写代码/函数来读取这些文件,或者只是操作方法来满足您的需要。我建议使用页面工厂。创建一个文件结构,其中包含要运行的操作序列。我会将每个“测试”分解为程序和操作。(正如我对我的“browsermator”所做的那样):这些过程对应于一个标准的可重复场景或bug报告。整个程序组相当于回归测试。当你可以使用你的应用程序动态地创建/存储/加载变量时,为什么还要编写这些定义变量的代码呢?我建议使用usi