Вложенные операторы if в C#

#c# #selenium #nested-loops

#c# #selenium #вложенные циклы

Вопрос:

Мне нужно написать условный оператор, который проверял бы, присутствует ли L tab.

  • если вкладка L отсутствует, будет выведено «L ОТСУТСТВУЕТ».
  • Если присутствует L, выводится «L присутствует» и проверяется, присутствуют ли вкладки S, C и K:
    • Если S присутствует, то будет выведено «S присутствует», иначе «S отсутствует.
    • Если присутствует C, то будет выведено «C присутствует», иначе «C отсутствует»,
    • …и то же самое для K.

У меня есть следующий написанный код, но по какой-то причине код мне не нравится. Любые идеи будут высоко оценены. Спасибо!

 if (Sel.IsElementPresent(arrObj1[4]))
{
    Lib.WriteDebugLogs("Test 1: General", "NORMAL", "L tab present in home page");
    Sel.Click(arrObj1[4]);
    if (Sel.IsElementPresent(arrObj1[5]))
    {
        Lib.WriteDebugLogs("Test 1: General", "NORMAL", "S tab present under L tab.");
    }

    if (Sel.IsElementPresent(arrObj1[6]))
    {
        Lib.WriteDebugLogs("Test 1: General", "NORMAL", "C tab present under L tab.");
    }

    if (Sel.IsElementPresent(arrObj1[7]))
    {
        Lib.WriteDebugLogs("Test 1: General", "NORMAL", "K tab present under L tab.");
    }


}
else
{
    s = "'L' tab is not displayed in the home page.";
    arrTestResults[6] = arrTestResults[7] = s;
    Lib.WriteDebugLogs("Test 1: General", "****ERROR****", "Could noT find the L tab");
}
  

Комментарии:

1. Одна очень простая вещь, позволяющая сделать код более читабельным, — это заменить arrObj1[x] на самокомментирующийся идентификатор (например, такую переменную, как tabK ) — возможно, это было бы сделано ВООБЩЕ БЕЗ использования arrObj1 массива…

Ответ №1:

Вы практически никогда не должны ссылаться на значения внутри массива с помощью «магических констант», которые, как вам известно, относятся к конкретным элементам. Итак, я собираюсь предположить, что где-то перед вызовом этого метода кто-то сделал что-то вроде этого:

 var tabs = new[] {
    new Tab{Name = "L", ParentName= "home page", Identifier = arrObj1[4],
    // and so on for the tabs you care about.
    };
  

Таким образом, первая часть вашего метода может быть заменена методом, который участвует только в отображении информации о том, какие вкладки отображаются:

 public void LogDisplayedTabs(IEnumerable<Tab> tabs) 
{
    for(var tab in tabs) 
    {
        if (Sel.IsElementPresent(tab.Identifier))
        {
            Lib.WriteDebugLogs("Test 1: General", "NORMAL", 
                string.Format("{0} tab present under {1} tab.", tab.Name, tab.ParentName));
        }
    }
}
  

Сейчас у меня нет времени рассматривать остальную часть метода, но этот шаблон должен помочь вам выяснить, как исправить остальное.