2010-08-06 3 views
0

Je construis un petit outil d'automatisation GUI-Test en C# pour une application. L'une des fonctions de l'outil de test consiste à fermer les boîtes de dialogue de l'application testée. Le problème que j'ai est de trouver le bouton sur lequel cliquer sans donner le nom complet de la classe. J'ai utilisé la méthode FindWindowEx pour obtenir la boîte de dialogue et le bouton sur lequel je veux cliquer. Je connais la légende du bouton, mais le problème est que j'ai aussi besoin de spécifier le nom de la classe pour le bouton. Le nom de la classe n'est pas toujours le même, mais il ressemble à ceci: "WindowsForms10.BUTTON.app.0.3ce0bb8". Par exemple, la partie à la fin "3ce0bb8" est différente si vous démarrez l'application localement ou via click-once. Donc, ma question est: Comment puis-je trouver le bouton avec juste spécifier la première partie (qui est toujours la même) de la classe comme ceci "" WindowsForms10.BUTTON.app. "Ou pourrais-je résoudre ce problème dans certains ? autre façonGUI-Test automation: Recherche de boutons WinForms via pinvoke avec C#

l'importation dll ressemble à ceci:

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

Mon code ressemble à ceci lorsque vous essayez de cliquer sur le bouton:

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); 
     } 
    } 

Répondre

2

Oui, c'est difficile, c Les noms de lass sont générés automatiquement. Vous ne pouvez pas utiliser FindWindowEx(), vous devez parcourir les contrôles avec EnumChildWindows() et GetClassName().

Vous pouvez adapter le code source pour le Managed Spy tool pour rendre tout cela beaucoup plus facile et plus propre.