做这样的事情有什么不对吗?我基本上只是试图断言这些元素存在,如果不存在则返回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;
}
}
这是错的,那么任何帮助将不胜感激。我是新来尝试捕获。
如果有一种方法可以告诉您在不抛出的情况下需要知道的内容,那么请调用它。
如果没有,那么你就是我称之为“烦恼的例外”的情况。摆脱这种情况的最好方法是编写缺少的方法。
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");
请注意,当您编写正确的抽象时,您的方法体会变得简洁明了。
关于检查多个事物并使用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;
如果你不等待,你就有可能会在浏览器中测试一个现在不存在的元素,但是会在几毫秒的时间内存在,并且你的脚本会给出一个过早的假阴性答案。
因为你是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;
}
}