做这样的事情有什么不对吗?我基本上只是试图断言这些元素存在,如果不存在则返回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;
}
}
这是错的,那么任何帮助将不胜感激。我是新来尝试捕获。
答案 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;
}
}