我正在为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);
}
}
答案 0 :(得分:2)
是的,这很难,类名是自动生成的。你不能使用FindWindowEx(),你必须使用EnumChildWindows()和GetClassName()迭代控件。
您可以调整Managed Spy tool的源代码,使所有这些更容易和更清洁。