【问题标题】:Try catch with list of assertion information尝试使用断言信息列表捕获
【发布时间】:2018-02-23 22:58:09
【问题描述】:

我有一个列表,其中包含我想要断言的信息。我想在网页上的表格中断言

我的代码看起来:

for (var X = 0; X < test.Count; X++)
{
    try
    {
        for (var i = 0; i <= 4; i++)
        {
            if (GetElement(i).Text == test[X].Type.ToString())
            {
                switch (test[X].Type)
                {
                    case Enum.Type.X:
                        [Asserts]
                         break;
                    case Enum.Type.Y:
                        [Asserts]
                        break;
                    case Enum.Type.Z:                                                                                
                    [Asserts]
                        break;
                    default:
                        break;
                }
                break;
            }
        }
        break;

    }
    catch (NoSuchElementException)
    {
        throw new NoSuchElementException($"text");
    }
}

我想要什么:

  • 我希望列表中的每一行都执行 if 语句。如果陈述正确,则断言完成。
  • 当断言正确时,应该返回并从列表中的第二条记录开始(命名为测试)。
  • 如果 if 语句永远不为真,则应该出现 catch (NoSuchElementException)。

列表看起来有4个字段,大部分时候有3条记录,有时4条记录视情况而定。

我希望检查列表中的每条记录。

目前它只检查列表中的第一条记录,然后停止。虽然我希望检查列表中的每条记录。

如果需要更多信息,请告诉我。

【问题讨论】:

  • 哇,嵌套层次让人难以阅读。您可以使用调试器跟踪问题吗?
  • 我试过但无法用调试器修复它,这就是我在这里问它的原因。
  • break 在try 的末尾有一个break,这将导致外循环永远无法通过X = 0
  • 使用调试器很容易找到break...
  • 我希望它在断言失败时停止。

标签: c# selenium-webdriver


【解决方案1】:

如果你想要一个break 的内循环到break 外循环,你需要使用某种类型的标志来做到这一点。您可以在两个循环的条件下使用该标志,而不是内部循环中的break,您只需相应地设置标志。您还需要从try 的末尾删除break,因为这会阻止外部循环进行多次迭代。如果您只想在 [Asserts] 上将其设置为 break,那么您需要将设置标志的代码相应地移动到每个 case。

bool keepGoing = true;
for (var X = 0; X < test.Count && keepGoing; X++)
{
    try
    {
        for (var i = 0; i <= 4 && keepGoing; i++)
        {
            if (GetElement(i).Text == test[X].Type.ToString())
            {
                switch (test[X].Type)
                {
                    case Enum.Type.X:
                        [Asserts]
                         break;
                    case Enum.Type.Y:
                        [Asserts]
                        break;
                    case Enum.Type.Z:                                                                                
                        [Asserts]
                        break;
                    default:
                        break;
                }

                keepGoing = false;
            }
        }
    }
    catch (NoSuchElementException)
    {
        throw new NoSuchElementException($"text");
    }
}

【讨论】:

  • 当它正确完成断言时,列表中的第一个会正常 (0)。然后它返回 for (var X = 0; X
  • 对于X=0 和0&lt;=i&lt;=4,GetElement(i).Text == test[X].Type.ToString() 是否为真?如果是这样,那么keepGoing 将被设置为false 并且两个循环都带有中断。还要确保test.Count 大于 1。
  • 我从第一个 for 中删除了 keepgoing 并降低了 bool keepGoing = true;一点点。然后它按我想要的方式工作。谢谢。
  • @xxx2017 那么这与从原始代码中删除第二个break 相同。当内部循环中的if 为真时,我认为您也想停止外部循环。如果没有,那么我会回到内部循环中的一个break 并摆脱keepGoing。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2023-03-22
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多