Это автоматическое тестирование пользовательского интерфейса 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;
}