Selenium WebDriver C# - 在抛出异常时继续

时间:2017-11-07 13:32:18

标签: c# unit-testing selenium exception-handling webdriver

我想检查页面上是否存在多个元素,如果不存在,我想查看一个自定义错误消息列表,告诉我哪些元素不存在。

目前我有:

测试用例:

[Test]
public void CheckAllElementsArePresent()
{
    Assert.IsTrue(Results.CheckFirstElement());
    Assert.IsTrue(Results.CheckSecondElement());
    Assert.IsTrue(Results.CheckThirdElement());
}

框架:

public static bool CheckFirstElement()
{
    var results = Driver.Instance.FindElement(By.CssSelector("firstElementSelector']"));

    if (results == null)
    {
        throw new Exception("Cannot find first element");
    }

    var attr = results.GetAttribute("id");
    if (attr == null)
    {
        throw new Exception("Cannot find first element");
    }

    if (attr.Contains("someTextIWantToFind"))
    {
        return true;
    }
    return false;
}

这将起作用,但是,如果其中任何一个失败,测试将失败。我需要一种方法来继续运行测试,然后在测试结束时吐出任何错误,例如:"找不到第一个元素","找不到第三个元素"等

感谢。

2 个答案:

答案 0 :(得分:0)

您可以做的是修改方法以返回错误字符串:

[Test]
public void CheckAllElementsArePresent()
{
    var errors = new List<string>();
    var error = Results.CheckFirstElement();
    if(error != null)
        errors.Add(error);
    error = Results.CheckSecondElement();
    if(error != null)
        errors.Add(error);
    error = Results.CheckThirdElement();
    if(error != null)
        errors.Add(error);

    if(errors.Any())
    {
        //Output to console
        var errorString = string.Join(";", errors);
        Console.Writeline(errorString);
        //Fail the test
        Assert.Fail(errorString);
    }

}

然后收集主要测试中发现的任何错误:

boolean

这只是一种方式。如果你想获得幻想,你可以获得更复杂的结果并返回一个具有ErrorMessagedef send_invoice_email(self, booking, user, bookingitems): customer_email = self.get_user_current_email() subject ="invoice" ctx = { 'hoardings': bookingitems } send_invoice.delay(customer_email, subject, ctx) 属性的类。

答案 1 :(得分:0)

创建一个新类,其中包含满足您需求的方法

public static class MakeSure
{
    private static List<string> errorsFound = new List<string>();
    public static List<string> getErrors() { return errorsFound; }

    public void ElementIsNotNull(IWebElement element, string elementName)
    {
        if(element == null)
        {
           errorsFound.Add("Cannot find element " + elementName +".");
        }
    }

    public void ElementHasAttribute(IWebElement element, string elementName, string attribute)
    {
        if(element.GetAttribute(attribute) == null)
        {
            errorsFound.Add("Cannot find " + attribute + " attribute of the element."); 
        }
    }

    public void ElementContaisText(IWebElement element, string elementName, string attribute, string text)
    {
        if(!element.GetAttribute(attribute).Text.Contains(text))
        {
            errorsFound.Add("Cannot find the text " + text +" in " + elementName +" element"); 
        }
    }
}

你可以从你的测试用例调用它们到“MakeSure”你的元素有一个特定的属性,不是null等你可以创建更多的重载,所以你不必每次都将“ID”放到“属性”,像这样:

public void ElementHasAttribute(IWebElement element, string elementName)
{
    ElementHasAttribute(element, elementName, "id");
}

因此,每当您希望属性为“id”时,您只需调用重载方法即可。您可以按照上面的示例执行任何操作,并根据需要更改代码/方法。

您还可以修改Results类以执行以下操作

public void CheckFirstElement()
{
    IWebElement firstElement;
    MakeSure.ElementIsNotNull(firstElement, "first element");
    MakeSure.ElementHasAttribute(firstElement, "first element", "id");
    MakeSure.ElementContaisText(firstElement, "first element", "id", "Text to validate.");
}

所以你在测试中所要做的就是:

Results.CheckFirstElement();