重构C#selenium代码以最小化代码重复

时间:2018-02-16 09:38:35

标签: c# selenium selenium-webdriver

我是新的C#和硒。我已经成功验证了一个场景,但是涉及到很多重复。由于我在测试用例中只有4种语言可供测试,因此很容易。我想知道如果我们要测试多种语言,我们该如何处理。我相信应该有一个简单的方法。请有人帮忙吗。请参阅下面的代码。

Browser.Driver.FindElement(By.Id("dropdownMenuLang")).Click();       
Browser.Driver.FindElement(By.XPath("//span[contains(., 'Espa')]")).Click();
Thread.Sleep(2000);
IWebElement body = Browser.Driver.FindElement(By.TagName("body"));
Assert.IsTrue(body.Text.Contains("Temperatura del frigorífico durante"));

Browser.Driver.FindElement(By.Id("dropdownMenuLang")).Click();          
Browser.Driver.FindElement(By.XPath("//span[contains(., 'Portu')]")).Click();            
Thread.Sleep(2000);            
IWebElement body1 = Browser.Driver.FindElement(By.TagName("body"));        
Assert.IsTrue(body1.Text.Contains("Gerenciamento De Serviços"));

Browser.Driver.FindElement(By.Id("dropdownMenuLang")).Click();            
Browser.Driver.FindElement(By.XPath("//span[contains(., 'Fran')]")).Click();            
Thread.Sleep(2000);            
IWebElement body2 = Browser.Driver.FindElement(By.TagName("body"));            
Assert.IsTrue(body2.Text.Contains("Gestion des emplacements"));

Browser.Driver.FindElement(By.Id("dropdownMenuLang")).Click();         
Browser.Driver.FindElement(By.XPath("//span[contains(., 'Türkçe')]")).Click();
Thread.Sleep(2000);
IWebElement body3 = Browser.Driver.FindElement(By.TagName("body"));
Assert.IsTrue(body3.Text.Contains("Konum Yönetimi"));

2 个答案:

答案 0 :(得分:0)

正如您所提到的,您要测试 4 语言,因此您可以按如下方式编写function()

public void clickLang_assertContent(String lang, String text_to_assert)
{
    Browser.Driver.FindElement(By.Id("dropdownMenuLang")).Click();
    Browser.Driver.FindElement(By.XPath("//span[.='" + lang + "']")).Click();
    WebDriverWait wait = new WebDriverWait(Browser.Driver, new TimeSpan(0,0,10));
    IWebElement body = wait.Until(ExpectedConditions.ElementIsVisible(By.TagName("body")));
    Assert.IsTrue(body.Text.Contains(text_to_assert));
}

现在,您可以在main()@Test带注释的类中使用选项调用函数clickLang_assertContent(),如下所示:

clickLang_assertContent("Espa", "Temperatura del frigorífico durante");
clickLang_assertContent("Portu", "Gerenciamento De Serviços");
clickLang_assertContent("Fran", "Gestion des emplacements");
clickLang_assertContent("Türkçe", "Konum Yönetimi");

答案 1 :(得分:0)

更有条理的处理方式,请注意扩展的灵活性是使用classes来定义test case,如下所示:

public class TestCases
{
        public TestCases(string elementTag, string id, string xpath, string textToMatch)
        {
            ElementTag = elementTag;
            Id = id;
            XPath = xpath;
            TextToMatch = textToMatch;
        }

        public string ElementTag { get; set; }

        public string Id { get; set; }

        public string XPath { get; set; }

        public string TextToMatch { get; set; }

}

此类将处理您需要更改Assertions所需的所有属性。

您可以写一个List<TestCases>来保存这些测试用例的所有values。如果您想稍后扩展您的功能,这是您在此处需要更改或添加内容的唯一内容。例如下面:

List<TestCases> CurrentTestCases = new List<TestCases>()
{
    new TestCases("body", "dropdownMenuLang", "//span[contains(., 'Espa')]", "Temperatura del frigorífico durante"),
    new TestCases("body", "dropdownMenuLang", "//span[contains(., 'Portu')]", "Gerenciamento De Serviços"),
    new TestCases("body", "dropdownMenuLang", "//span[contains(., 'Fran')]", "Gestion des emplacements"),
    new TestCases("body", "dropdownMenuLang", "//span[contains(., 'Türkçe')]", "Konum Yönetimi")
};

最后,您需要一种方法来快速执行整个操作。您可以使用如下所示的简单foreach循环执行此操作:

private void StartTesting()
    {

        foreach (var testCase in CurrentTestCases)
        {
            Browser.Driver.FindElement(By.Id(testCase.Id)).Click();
            Browser.Driver.FindElement(By.XPath(testCase.XPath)).Click();
            WebDriverWait wait = new WebDriverWait(Browser.Driver, new TimeSpan(0,0,10));
            IWebElement body3 = Browser.Driver.FindElement(By.TagName(testCase.ElementTag));
            Assert.IsTrue(body3.Text.Contains(testCase.TextToMatch));
        }
    }
  

我已经取出了所有的字符串硬编码,只是因为你想要那种灵活性,如果你不这样做,你可以通过简单地删除课堂上的属性来减少它。