2010-01-12 4 views
1

J'ai un faisceau de test qui s'exécute dans un moteur IronPython intégré dans notre application C#. Certains des tests sont l'automatisation de l'interface utilisateur qui simulent les clics de bouton, etc.cast existant Sous-classe de IPy

# assume code to find an existing button, 'b' is an instance of System.Windows.Forms.Button 
b.OnClick(EventArgs()) 

La question que j'ai est que le code ci-dessus fonctionne sur ipy 2.0.2 et non sur 2,6. En lisant le lien ci-dessous, je peux voir pourquoi ça ne marche plus.

http://dlr.codeplex.com/Thread/View.aspx?ThreadId=57324

Je créé un sublclass python comme suit:

class PyButton(Button):pass 

Cela fonctionne bien si vous allez créer une nouvelle instance de PyButton et tenter onclick(). Cependant, dans mon cas, je dois effectuer un OnClick sur un bouton existant. Essentiellement, je veux faire ce qui suit, pour me permettre de simuler le clic sur le bouton:

  • obtenir une référence à bouton WinForms existants
  • Cast/bouton Convertir à la sous-classe PyButton personnalisée (pour permettre OnClick)
  • Appel onclick

J'ai essayé d'utiliser clr.Convert:

import clr 
from System.Windows.Forms import * 
class PyButton(Button):pass 
# assume b = existing button 
pb = clr.Convert(b, clr.GetClrType(PyButton)) 

... mais je reçois cette erreur:

expected Button_2$2, got Button 
    input was pb = clr.Convert(b, clr.GetClrType(PyButton)) 

Répondre

0

Vous ne pouvez pas - tout comme vous ne pouvez pas l'appeler de C# ou VB.Net ou d'autres langages .NET sans avoir une sous-classe. Au lieu de cela, vous voulez probablement appeler Button.PerformClick()

+0

Hélas - Button.PerformClick() fonctionne très bien dans le cas de Button, mais il me semble que le bouton est le seul contrôle avec cette méthode. Dans le cas plus général, je dois également faire des clics sur d'autres objets, tels que des éléments de menu. J'ai fini par utiliser la réflexion pour accéder à OnClick (ainsi qu'à certains des autres événements de saisie de l'utilisateur). Merci! –