TestStack.White Работа с меню в зависимости от состояния занятости системы
Это проверка автоматизации пользовательского интерфейса Windows 10 через nunit3.ConsoleRunner
,
Это действительно довольно странно, но тот же код, который работал безупречно до моего отпуска, теперь зависает до 2 часов и более. Я создал свой собственный MenuClick()
Метод для наших испытаний, потому что стандарт MenuBar.MenuItem()
Метод часто зависал при навигации по пунктам меню 2-го уровня. Мой метод работал хорошо до моего отпуска, как я уже сказал.
Во всяком случае, теперь, Menu.SubMenu()
Звонок часто занимает 2 часа или более, что недопустимо.
Еще одна странность в том, что тестовый код щелкает элементы меню 3-го уровня попарно, где они оба открывают диалоговое окно "Обзор папки". Первый, чтобы выбрать исходную папку, а другой, чтобы выбрать папку назначения. "Зависание" происходит ТОЛЬКО (пока) при попытке получить 2-й уровень submenu
для второго в паре щелчков по пункту меню 3-го уровня.
Чтобы обойти это в настоящее время, я создаю новый поток, который вызывает menu = menuBar.MenuItem(). В главном потоке я жду, пока меню не станет нулевым, или произойдет тайм-аут, прежде чем перейти к 500-миллисекундному сну между проверками. Это по крайней мере позволяет мне повторить попытку. Однако создается впечатление, что при возникновении этого условия остальные операции меню во всем тестируемом приложении зависают, поэтому я не могу повторить попытку. Похоже, ошибка в области обработки меню TestStack.White.
public static void GetSubMenu(object obj)
{
string[] menuNames = obj as string[];
menu = menuBar.MenuItem(menuNames);
}
private static MenuBar menuBar = null;
private static Menu menu = null;
public static int ClickMenu(MenuBar mainMenu, params string[] menuItems)
{
menuBar = mainMenu;
bool bDone = false;
menu = null;
System.Threading.Thread t = new System.Threading.Thread(GetSubMenu);
t.Start(menuItems);
System.Threading.Thread.Sleep(500);
DateTime timeOut = DateTime.Now + TimeSpan.FromSeconds(10);
while (menu == null && DateTime.Now < timeOut)
{
System.Threading.Thread.Sleep(500);
}
if (menu != null)
{
menu.Click();
bDone = true;
log.Info($"ClickMenu success");
}
t.Abort();
return bDone ? 1 : 2;
}
1 ответ
ОК, я решил, что TestStack.White
Операции меню чувствительны к состоянию занятости системы, когда поток, который пытается выполнить операции, не получает достаточно временных интервалов для работы, поэтому может занять ОЧЕНЬ, ОЧЕНЬ много времени.
Установка приоритета рабочего потока ThreadPriority.Highest
является ключевым в том, как я реализовал свой набор тестов ClickMenu()
метод следующим образом:
public static class Util
{
static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static MenuBar menuBar = null;
public static void MenuItem(object obj)
{
string[] path = obj as string[];
menuBar.MenuItem(path).Click();
}
public static void ClickMenu(MenuBar mainMenu, params string[] menuItems)
{
menuBar = mainMenu;
System.Threading.Thread t = new System.Threading.Thread(MenuItem);
t.Priority = System.Threading.ThreadPriority.Highest;
t.Start(menuItems);
DateTime startTime = DateTime.Now;
while (t.IsAlive)
{
System.Threading.Thread.Sleep(100);
}
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime - startTime;
if (duration.Seconds > 60)
{
log.Info($"Menu Operation duration = {duration.Seconds} sec");
}
}
}