GUI测试自动化:使用c#通过pinvoke查找WinForms按钮

时间:2010-08-06 12:51:42

标签: c# pinvoke ui-automation

我正在为C#构建一个用于应用程序的小型GUI测试自动化工具。 测试工具中的一个功能是关闭从测试应用程序弹出的对话框。

我遇到的麻烦是找到点击按钮而不提供完整的班级名称。我使用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 个答案:

答案 0 :(得分:2)

是的,这很难,类名是自动生成的。你不能使用FindWindowEx(),你必须使用EnumChildWindows()和GetClassName()迭代控件。

您可以调整Managed Spy tool的源代码,使所有这些更容易和更清洁。