Автоматизация GUI-теста: поиск кнопок WinForms с помощью pinvoke с помощью c # - PullRequest
0 голосов
/ 06 августа 2010

Я создаю небольшой инструмент автоматизации GUI-Test в C # для приложения.Одна из функций в тестовом инструменте - закрывать всплывающие диалоговые окна из тестируемого приложения.

Проблема, с которой я столкнулся, заключается в том, чтобы найти кнопку, на которую можно нажать, без указания полного имени класса.Я использовал метод FindWindowEx, чтобы получить диалоговое окно и кнопку, на которую я хочу нажать.Я знаю заголовок кнопки, но проблема в том, что мне также нужно указать имя класса для кнопки.Имя класса не всегда одинаково, но выглядит примерно так: «WindowsForms10.BUTTON.app.0.3ce0bb8».Например, часть в конце «3ce0bb8» отличается, если вы запускаете приложение локально или с помощью щелчка один раз.

Итак, мой вопрос: как найти кнопку с указанием только первой части (всегда один и тот же) этого класса "" WindowsForms10.BUTTON.app. "Или я могу решить эту проблему другим способом?

Импорт DLL выглядит следующим образом:

[DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string pszWindow);

Мой код выглядит примерно так при попытке нажать кнопку:

private void SendDialogButtonClick(IntPtr windowHandle, ApplicationStartType applicationStartType)
    {
        if (applicationStartType == ApplicationStartType.Localy)
            buttonClassName = "WindowsForms10.BUTTON.app.0.3ce0bb8";
        else if (applicationStartType == ApplicationStartType.ClickOnce)
            buttonClassName = "WindowsForms10.BUTTON.app.0.3d893c";

        // Find the "&No"-button
        IntPtr buttonAndNoHandle = FindWindowEx(windowHandle, IntPtr.Zero, buttonClassName, "&No");

        // Send the button click event to the appropriate button found on the dialog
        if (buttonAndNoHandle.ToInt64() != 0)
        {
            SendMessage(new HandleRef(null, buttonAndNoHandle), WM_CLICK, IntPtr.Zero, IntPtr.Zero);
        }
    }

1 Ответ

2 голосов
/ 06 августа 2010

Да, это сложно, имена классов генерируются автоматически.Вы не можете использовать FindWindowEx (), вам нужно перебрать элементы управления с помощью EnumChildWindows () и GetClassName ().

Вы можете адаптировать исходный код для инструмента Managed Spy , чтобы сделать всеэто намного проще и чище.

...