Кодированный пользовательский интерфейс для обнаружения элементов управления - PullRequest
1 голос
/ 29 мая 2011

У меня есть тестовый пользовательский интерфейс в Visual Studio 2010. Я хочу написать код, который будет:

  1. Обнаружить все элементы управления в окне и дочерних окнах , которыеare button, grid, label
  2. напишите uimap с идентификатором, который является именем элемента управления в коде.

Для его запуска я напишу следующее:

public void CodedUITestMethod1()
{    
   string uiTestFileName = @"D:\dev11\ConsoleApplication1\TestProject1\UIMap.uitest";

   UITest uiTest = UITest.Create(uiTestFileName);

   Microsoft.VisualStudio.TestTools.UITest.Common.UIMap.UIMap newMap = new Microsoft.VisualStudio.TestTools.UITest.Common.UIMap.UIMap(); 
   newMap.Id = "UIMap"; 
   uiTest.Maps.Add(newMap);

   GetAllChildren(BrowserWindow.Launch(new Uri("http://bing.com")), uiTest.Maps[0];);
   uiTest.Save(uiTestFileName);    
}

private void GetAllChildren(UITestControl uiTestControl, Microsoft.VisualStudio.TestTools.UITest.Common.UIMap.UIMap map)
{
   foreach (UITestControl child in uiTestControl.GetChildren())
   {
       map.AddUIObject((IUITechnologyElement)child.GetProperty(UITestControl.PropertyNames.UITechnologyElement));

       GetAllChildren(child, map);    
    }    
}

Но он вставляется в рекурсивный цикл и не заканчивает его.

Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 08 июня 2011

Я думаю, что, чтобы избежать возможной бесконечной рекурсии, вы должны добавить этот код:

private void GetAllChildren(UITestControl uiTestControl, Microsoft.VisualStudio.TestTools.UITest.Common.UIMap.UIMap map)
{
  foreach (UITestControl child in uiTestControl.GetChildren())
  {
      IUITechnologyElement tElem=(IUITechnologyElement)child.GetProperty(UITestControl.PropertyNames.UITechnologyElement);
      if (!map.Contains(tElem))
      {
          map.AddUIObject(tElem);
          GetAllChildren(child, map);    
      }
  }    
}

Таким образом, вы избегаете рассматривать один и тот же объект несколько раз и держитесь подальше от возможного цикла визуального дерева.

0 голосов
/ 02 июня 2011

Убедитесь, что у ребенка есть дети, прежде чем вызывать GetAllChildren (child, map)

if(child.HasChildren) {
   GetAllChildren(child, map);
}
0 голосов
/ 01 июня 2011

Прежде чем вызывать map.AddUIObject и GetAllChildren в цикле foreach, убедитесь, что объект еще не существует в коллекции карт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...