try catch语句中的多重检查 - 这没关系吗?

时间:2018-01-02 00:06:39

标签: c# selenium-webdriver try-catch

做这样的事情有什么不对吗?我基本上只是试图断言这些元素存在,如果不存在则返回false:

public static bool IsAllDataPresent()
{
    try
    {
        Driver.Instance.FindElement(By.Id("id-a");
        Driver.Instance.FindElement(By.Id("id-b");
        Driver.Instance.FindElement(By.Id("id-c");
        return true;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
}

这是错的,那么任何帮助将不胜感激。我是新来尝试捕获。

3 个答案:

答案 0 :(得分:3)

如果有一种方法告诉您需要知道没有投掷的内容,请调用它。

如果没有,那么你就是我称之为“烦恼的例外”的情况。解决这种情况的最佳方法是编写缺少的方法

public static bool IsPresent(string id)
{
    try
    {
        Driver.Instance.FindElement(By.Id(id);
        return true;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
}

现在你的方法是明智的:

public static bool IsAllDataPresent() => 
  IsPresent("id-a") && IsPresent("id-b") && IsPresent("id-c");

请注意,当您编写正确的抽象时,您的方法体会变得简洁明了。

答案 1 :(得分:1)

关于检查多个事物并使用try-catch的具体问题...没有问题,除非它失败了,你丢弃的异常会告诉你哪个缺少的东西。

一般情况下,如果您希望找到元素,则应等待以使其存在。如果它们现在存在,则不会等待。

示例:

WebDriverWait wait = new WebDriverWait(Driver.Instance, new TimeSpan(0,0,5));
wait.Until(ExpectedConditions.ElementExists(By.Id("id-a")));
wait.Until(ExpectedConditions.ElementExists(By.Id("id-b")));
wait.Until(ExpectedConditions.ElementExists(By.Id("id-c")));
return true;

如果您不等待,那么您可能会在浏览器中测试一个现在不存在的元素,但是会在几毫秒内存在,并且您的脚本会给出一个过早的,假阴性的答案。

答案 2 :(得分:0)

正如您trying to assert that these 三个元素 exist and if not then return false,您可以根据以下代码块优化代码:

public static bool IsAllDataPresent()
{
    if(Driver.Instance.FindElement(By.XPath("//*[@id='id-a' or @id='id-b' or @id='id-c']")).size() != 3)
    {
        Console.WriteLine("All the 3 elements exists")
        return true;
    }
    else
    {
        Console.WriteLine("All the 3 elements doesn't exists")
        return false;
    }
}