Kann nicht feststellen, ob ein bestimmtes UITestControl in meiner Webanwendung existiert

9

Ich versuche derzeit, einige codierte UI-Tests mit C # für eine Webanwendung zu automatisieren. Ein häufiges Problem, das mir begegnet, ist, dass es extrem schwierig sein kann zu bestimmen, ob ein UITestControl -Objekt auf der Seite existiert oder nicht. Leider ist die Microsoft-Dokumentation auf ihrer MSDN-Website für alles, was mit codierten UI-Tests zu tun hat, praktisch nicht existent ( siehe ihre Seite für UITestControl ).

Grundsätzlich frage ich:

  • Was ist der beste Weg um festzustellen, ob ein UITestControl auf der Seite existiert oder nicht?
  • Wie funktioniert die Eigenschaft UITestControl.Exists ?
  • Was macht die UITestControl.Find() -Methode?
  • Wie funktioniert die Methode UITestControl.TryFind() ?

Wie ich versucht habe, damit umzugehen:

Wie ich bereits erwähnt habe, ist die Dokumentation zu all diesen Klassen und Methoden meistens leer. Das Beste, was Sie dazu bekommen können, eine der Methoden und Eigenschaften zu beschreiben, ist eine 1-zeilige Beschreibung in Intellisense, also experimentiere ich mit den aufgelisteten Methoden.

Zuerst habe ich versucht, zu überprüfen, ob die Eigenschaft UITestControl.Exists wahr ist, aber im Laufe der Zeit und nach Rücksprache mit anderen wurde klar, dass sie immer wahr zurückgibt, auch wenn der Browser nicht geöffnet ist. Da die Option, die am offensichtlichsten erschien, nicht funktionierte, habe ich versucht, die Methode UITestControl.Find() zu verwenden, aber da sie keine Argumente benötigt und nichts zurückgibt, konnte ich nicht herausfinden, was sie getan hat. Ich habe versucht, die UITestControl.TryFind() -Methode zu verwenden, und gelegentlich hat es funktioniert, aber ich fand, dass es nur falsch zurückgab, wenn ich nicht auf der richtigen Seite war; es kam immer anders zurück. Klar hatte ich keine Ahnung, wie es funktionierte und sollte es nicht als Test verwenden.

Ich dachte, wenn ich die bereitgestellten Methoden nicht für ihre Arbeit bekommen könnte, müsste ich versuchen, meine eigenen Tools zu entwickeln. Ich habe zuletzt versucht, Mouse.Hover(UITestControl) in einem try / catch-Block zu verwenden, um festzustellen, ob das Steuerelement wie folgt existiert:

%Vor%

Es funktioniert manchmal, aber in bestimmten Situationen scheint es aus Gründen, die ich nicht verstehe, falsche Positive zurückzugeben. Ich fliege immer noch blind, und ich habe fast keine Ideen mehr.

Ich verwende Visual Studio 2012 und Microsoft .NET Framework Version 4.5.50709.

    
Daniel Stone 13.11.2013, 18:52
quelle

3 Antworten

3

Teilantwort zu den Methoden Find() und TryFind() .

Nach dem Festlegen der verschiedenen Sucheigenschaften in der Klasseninstanz für das Steuerelement führt die Find() -Methode die Suche nach einem übereinstimmenden Steuerelement durch. Die SearchProperties werden verwendet, um ein Steuerelement zu finden. Wenn keine Steuerelemente gefunden werden, schlägt die Suche fehl - vergessen Sie genau, was dann passiert, möglicherweise wird eine Ausnahme ausgelöst, aber die Dokumentation besagt das nicht. Wenn ein Steuerelement gefunden wird, dass die Find() abgeschlossen ist. Wenn zwei oder mehr gefunden werden, wird die Suche mit FilterProperties fortgesetzt, um die Anzahl der gefundenen Steuerelemente auf eins zu reduzieren.

Der Codierte UI-Rekorder erzeugt Code des Stils UIControl aControl = this.UIMap.uione.uitwo.uithree; , was zur Frage führt, wie uione einen Wert erhält, der sich auf ein Steuerelement bezieht, so dass uitwo ausgewertet werden kann? Die einzige Antwort, die ich gefunden habe, ist im Description Teil von Ссылка , die besagt, dass " die Suche nach dem Steuerelement startet (explizit durch Find () oder implizit durch jede Verwendung des Steuerelements in Aktionen oder Eigenschaftsüberprüfungen) ".

So Find() führt die Suche nach einem Steuerelement durch und kann explizit oder implizit aufgerufen werden.

TryFind() ist im Grunde das gleiche wie Find() , außer dass es einen booleschen Wert zurückgibt, der angibt, ob das Steuerelement gefunden wurde. Auch hier ist die Dokumentation schlecht, aber ich glaube, dass TryFind() true zurückgibt, wenn genau ein Steuerelement gefunden wird, false andernfalls.

Eine weitere nützliche Suchmethode ist FindMatchingControls , die eine (möglicherweise leere) Sammlung aller Steuerelemente zurückgibt, die den Suchkriterien entsprechen.

Gemäß der Antwort von yonitdm kann die Verwendung von BoundingRectangle hilfreich sein, wenn mehrere übereinstimmende Elemente vorhanden sind, die meisten jedoch nicht angezeigt werden. Die Werte von Top und Left können ebenfalls verwendet werden. Doing a FindMatchingControls und Screening der Ergebnisse, um alles mit negativen Top oder Left zu ignorieren, kann funktionieren.

Bei der Entwicklung von Tests ist die Methode DrawHighlight nützlich, sie zeichnet ein Rechteck um ein Steuerelement. Die gleiche Art von Rechteck, die beim Aufnehmen von Assertions mit dem Fadenkreuz-Werkzeug gezeichnet wird.

Der Inhalt der codierten Benutzeroberfläche Index hat viele gute Informationen. Der Link zu "Wie findet UI Test Framework (Suche) nach einem Steuerelement" kann für Sie besonders hilfreich sein.

    
AdrianHHH 13.11.2013 22:42
quelle
1

Anstatt obj.Exists () zu verwenden, haben wir unsere eigene exists-Methode codiert, die einen Kombinationsansatz von EnsureClickable () und BoundingRectangle.Width & gt; 0, um sicherzustellen, dass das Steuerelement über einen Bildschirmpunkt verfügt.

ETA- oops, sorry, hat einen wichtigen Teil weggelassen. Wenn Sie die Option .Width hinzufügen, um sicherzustellen, dass sie größer als 0 ist, müssen Sie möglicherweise die Länge verwenden, wenn die Breite irgendwie nicht funktioniert.

    
yonitdm 14.11.2013 22:17
quelle
1

Ich benutze tryfind () .. es funktioniert gut.

%Vor%

Früher habe ich obj_webor.GenLink.exist () .. verwendet, aber es gab einen Fehler, wenn das Steuerelement nicht existierte und eine Exception auftritt. tryfind ist in Ordnung

    
Shashi Kumar 11.08.2015 10:38
quelle