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:
UITestControl
auf der Seite existiert oder nicht? UITestControl.Exists
? UITestControl.Find()
-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:
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.
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.
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.
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
Tags und Links c# web-applications visual-studio-2012 coded-ui-tests