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

问题描述 投票:-1回答:3

做这样的事情有什么不对吗?我基本上只是试图断言这些元素存在,如果不存在则返回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;
    }
}

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

c# selenium-webdriver try-catch
3个回答
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
投票

关于检查多个事物并使用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;

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


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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.