【发布时间】:2019-11-27 13:49:52
【问题描述】:
我正在使用 Nunit 和 C# 中的 selenium 编写一些 Web 测试 我做了一个导致一些奇怪行为的方法。
方法的重点是尝试一些动作。
如果动作成功退出方法。
如果操作引发异常,请等待 100 毫秒,然后重试。
如果操作尝试的次数超过了某个超时整数,则抛出超时异常。
如果操作引发异常,我还想添加一个选项来执行其他操作。
这是代码:
public void Tryfor(Action tryAct, Action catchAct = null, int timeout = 50)
{
while (true) //loops until error or exception
{
Console.WriteLine(timeout); //For debugging
if (timeout-- < 0) throw new TimeoutException("Tryfor timed out"); //reduce timeout by 1, when it reaches 0 throw exception
try
{
tryAct();
break; // If the try action succeeds with no exception, exit loop
}
catch //If any exception is throw in the try action
{
catchAct?.Invoke(); //If an action has been passed in the catch action, evoke it, else do nothing
}
Thread.Sleep(100); //wait 100 ms and try the try action again
}
}
这在大多数情况下都可以正常工作,但如前所述,它有时会以一种我无法真正理解的奇怪方式表现。
经常发生的情况是方法运行通过,可能在成功之前失败了 2 次。然后在成功之后,它会抛出它捕获的所有错误。
更常见的是它达到了超时,这意味着它失败了(在这种情况下)50 次。 然后它不只是抛出超时错误,而是抛出它应该捕获的 50 个错误。
我的目标当然只是创建一种方法来完成我所描述的操作,但我真的很想了解它如何以及为什么会抛出它捕获的所有错误。
【问题讨论】:
-
您描述的情况是否总是在使用相同参数调用时发生?另外你怎么知道“它抛出了它应该捕获的 50 个错误”,因为如果没有正确捕获,第一个抛出的错误应该已经停止了程序?
-
@Rafalon 不,我将它用于几个不同的测试。例如,我有一个我可以从日志中看到它在通过之前尝试了 13 次,然后它继续测试,一旦测试完成,它就会抛出这 13 个异常。导致测试成功报告为失败。
-
我用您的代码here 创建了一个.NET Fiddle,但它似乎没有同样的问题。我们需要更多关于参数是什么的信息
-
失败13次的就是这个动作传递给方法:Assert.AreEqual(Activecheckbox.Selected, true);没有其他的。只是失败了几次,直到复选框正确加载
-
哦等等,你的意思是你将
Asserts 作为tryAct方法传递?所以这就像你在写for(int i = 0; i < 50; i++) { Assert.AreEqual(...,...); Thread.Sleep(100); }只是有点尝试/捕捉左右。请注意,在测试方法中,如果任何Asserts 失败,则整个测试失败。这是正常行为,也不同于抛出的异常。我认为你应该在你的问题中包含你的测试方法,因为它会澄清很多
标签: c# selenium loops try-catch nunit