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");
        }
    }
}
Другие вопросы по тегам