Descriptive Programmierung in QTP/UFTDynamisch & Statisch

⚡ Intelligente Zusammenfassung

Descriptive Programming ermöglicht ein QTP or UFT Eine Anweisung enthält die Objektbeschreibung selbst, entweder als Eigenschaftswertpaare oder als … Description-Objekt, sodass ein Schritt auch dann ausgeführt wird, wenn das Objekt nie im Objekt-Repository gespeichert wurde.

  • 🔘 Umgeht das Repository: Die Beschreibung wird innerhalb der Anweisung mitgesendet, sodass zur Laufzeit kein Objektname nachgeschlagen werden muss.
  • ☑️ Statische Form: Eigenschaftswertpaare werden als „Eigenschaft:=Wert“ inline geschrieben und innerhalb des Testobjektaufrufs durch Kommas getrennt.
  • ✅ Dynamische Form: Description.Create erstellt eine wiederverwendbare Eigenschaftensammlung, die von mehreren Anweisungen gemeinsam genutzt werden kann.
  • 🧪 Konzipiert für unvorhersehbare Objekte: Automatisches Ausblenden von Bedienfeldern, sich ändernde Hierarchien, verschachtelte innere Objekte und Ergebnismengen unbekannter Größe.
  • ️ ChildObjects passt dazu: A DescriptEin als Filter verwendetes ion-Objekt gibt nur die übereinstimmenden Kinder eines übergeordneten Elements zurück.
  • 📌 Zwei Regeln, die man sich merken sollte: Jeder Eigenschaftswert wird als regulärer Ausdruck behandelt, und sobald Sie ein übergeordnetes Element beschreiben, müssen Sie auch dessen untergeordnete Elemente beschreiben.

Statische und dynamische beschreibende Programmieraussagen in QTP und UFT Eins

Was ist Descriptive Programmierung?

Descriptive Programmierung wird verwendet, um Operationen an einem Objekt in der zu testenden Anwendung (AUT) auszuführen, dessen Definition nicht in der Datenbank gespeichert ist. Objekt-RepositoryMithilfe dieses Mechanismus können Sie die Identifizierung durch das Objekt-Repository umgehen und das Objekt bereitstellen. Description in der Aussage selbst.

Ein Objektname dient lediglich dazu, ein Objekt in einem Skript seiner Beschreibung in einem Objekt-Repository zuzuordnen. Das bedeutet: Selbst wenn Sie den Objektnamen sowohl im Skript als auch im Objekt-Repository ändern, sollte das Skript weiterhin ausgeführt werden können. Sehen Sie sich dazu das folgende Video an.

Klicken Sie auf werden auf dieser Seite erläutert wenn das Video nicht zugänglich ist

Video Highlights

  • Löschen des Objekts DescriptDas Objekt „Agent Name WinEdit“ aus dem Objektrepository wird nicht erkannt. Wenn Sie den Test erneut ausführen, schlägt er fehl. Untersuchen wir die Ursache für das Fehlschlagen des Skripts.
  • Während der Laufzeit UFT Man identifiziert die Operation, die im WinEdit-Feld ausgeführt wird, und das Objekt. DescriptDie Ion im Objekt-Repository wird als Agentenname gespeichert. Dieser Name wird verwendet, um track ist das Objekt im Objekt-Repository. Für ein übergeordnetes Objekt können keine zwei untergeordneten Objekte mit demselben Namen existieren, daher QTP Das Objekt wird im Repository eindeutig zugeordnet. Anschließend wird die gespeicherte Beschreibung aus dem Objekt-Repository verwendet, der Name durch die Beschreibung ersetzt und die resultierende Anweisung genutzt, um das Objekt in der zu testenden Anwendung zu identifizieren.
  • Da wir in unserem Fall diese Objektbeschreibung vollständig gelöscht hatten, schlägt das Skript fehl.
  • Was aber, wenn stattdessen QTP Ersetzen Sie die Objektbeschreibung, indem Sie als Tester die Objektbeschreibungen direkt in Ihrem Skript angeben? Das ist nichts anderes als „Descriptive Programmierung“

Diese eine Verlagerung der Verantwortung wird durch die beiden untenstehenden Formulare umgesetzt, und jedes Formular eignet sich für eine andere Art von Drehbuch.

Arten von Descriptive Programmierung

Sie können verwenden Descriptive Programmierung auf zwei Arten

  1. Statisch
  2. Dynamisch

Statisch Descriptive Programmierung

Bei der statischen Methode geben Sie zur Objektidentifikation die Eigenschaft eines Objekts im folgenden Format an

property:=values,

Dieses Format wird als Eigenschaft-Wert-Paar bezeichnet und in Anführungszeichen gesetzt. Ausgeschrieben sieht eine statische Anweisung folgendermaßen aus:

TestObject("PropertyName1:=PropertyValue1", "PropertyName2:=PropertyValue2").Method

Wenn Ihr Objekt mehrere Beschreibungen zur Identifizierung verwendet, können Sie diese mithilfe von Kommas angeben.

In unserem Fall lautet die Beschreibung für den Agentennamen also

"nativeclass:=Edit", "attached text:=Agent Name:"

Statische Beschreibungen werden an der Stelle gelesen, an der die Anweisung ausgeführt wird. Dadurch eignen sie sich ideal für einmalige Schritte und für schnelle Korrekturen an einem Skript, das man nicht neu aufzeichnen möchte.

Dynamisch Descriptive Programmierung

Die zweite Methode, die gleiche Aktion durchzuführen, ist die Verwendung von Dynamic Descriptive Programmierung

Falls Ihr Skript den Objektkandidaten für die beschreibende Programmierung mehrmals verwendet, ist es sehr mühsam, alle Eigenschaftswertpaare für jede Anweisung anzugeben

In solchen Fällen können Sie Folgendes nutzen: DescriptIonenklasse bereitgestellt von QTP

Die Syntax zum Erstellen eines Beschreibungsobjekts lautet:

Set MyDescription = Description.Create()
MyDescription("property").Value = "property-value"

Dies ist die dynamische Methode

Durch das Hinzufügen der oben verwendeten Agentennamen-Eigenschaften zu diesem Objekt erhält man eine vollständige, wiederverwendbare Beschreibung:

Dim oDesc
Set oDesc = Description.Create()
oDesc("nativeclass").Value = "Edit"
oDesc("attached text").Value = "Agent Name:"

Die Variable oDesc kann nun an jede Anweisung übergeben werden, die dieses Objekt benötigt, sodass eine Bearbeitung jeden Schritt aktualisiert, der es verwendet.

Statisch vs. Dynamisch DescriptLive-Programmierung: Wann verwendet man welches Programm?

Beide Formen erzeugen die gleiche Laufzeitbeschreibung, daher geht es bei der Wahl eher um die Wartung als um die Leistungsfähigkeit.

Eigenschaften Statisch (inline) Dynamisch (DescriptIonenobjekt)
Wie die Beschreibung geschrieben wird Die im Testobjekt eingegebenen Eigenschaftswertpaare rufen Eigenschaften, die einem Objekt hinzugefügt wurden, das mit Description.Create()
Wiederverwendung: Wird in jeder Anweisung wiederholt, die das Objekt benötigt. In einer Variable gespeichert und überall dort übergeben, wo sie benötigt wird
Ablesbarkeit Kurze Aussagen bleiben lesbar; lange werden unübersichtlich. Zusätzliche Setup-Zeilen, aber die Anweisung selbst bleibt kurz
Laufzeitänderungen Die Werte sind fest, sofern sie nicht aus Variablen verkettet werden. Die Eigenschaftswerte können vor jeder Verwendung neu zugewiesen werden.
Funktioniert mit untergeordneten Objekten Nein, das Filterargument muss ein DescriptIonenobjekt Ja, dies ist das erforderliche Formular.
am besten geeignet für Ein oder zwei Schritte an einem Objekt, das sich nicht im Repository befindet. Objekte, die wiederholt verwendet werden, oder Sammlungen, die zur Laufzeit abgerufen werden

Warum verwenden Descriptive Programmierung?

Das unten stehende Transkript begleitet die Video-Anleitung zu einem realen Szenario, in dem die Anzahl der Objekte nicht im Voraus bekannt sein kann.

Video Transcript

  • Die Millionen-Dollar-Frage ist, warum man DP verwenden sollte, wenn der Objektidentifizierungsprozess von ... übernommen wird. QTP
  • Angenommen, Sie sollen ein Jobportal testen. Sie geben eine Suchanfrage in das Portal ein, und der Test erwartet von Ihnen, dass Sie alle verfügbaren Stellen auswählen und auf „Bewerben“ klicken.
  • Die Anzahl der angezeigten Stellen hängt jedoch von der Suchanfrage und den zum Zeitpunkt der Skriptausführung verfügbaren Stellen ab, und es gibt keine Möglichkeit, die Anzahl der angezeigten Stellen im Voraus vorherzusagen.
  • In solchen Fällen können Sie deskriptive Programmierung verwenden. Auch wenn Sie weder die Anzahl noch die Namen der Kontrollkästchen kennen, kennen Sie die Klasse der Objekte als „WebCheck“.Box"
  • Sie können die Verwendung Methode ChildObjects um Objekte zurückzugeben, die zu einem bestimmten übergeordneten Element gehören
  • Eine Codezeile wie –
    Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()

    Gibt alle untergeordneten Objekte dieser Seite zurück.

  • Aber wir wollen nur WebCheckBox Objekte. Dazu können wir ein Filterobjekt erstellen und dessen Eigenschaft auf die Web-Checkbox-Klasse setzen. Anschließend übergeben wir diesen Filter als Argument an die Methode ChildObjects.
  • In diesem Fall werden nur die Kontrollkästchen zurückgegeben.
  • Als Nächstes können Sie Code wie diesen schreiben, der auf die gesamte Sammlung von Kontrollkästchen ab Null zugreift und alle Kontrollkästchen aktiviert.
  • Anschließend können Sie auf die Schaltfläche „Anwenden“ klicken, um den Test abzuschließen
  • Sie können auch DescriptIntelligente Programmierung zum Ausführen schwer aufzuzeichnender Objekte, wie z. B. automatisch auszublendende Bedienfelder, Objekte mit wechselnden Hierarchien, verschachtelte innere Objekte, Untermenüs.
  • Mithilfe der deskriptiven Programmierung können Sie auch erweiterte Zeichenfolgenmanipulationen durchführen
  • In Verbindung mit der Index-Eigenschaft kann die deskriptive Programmierung sehr nützlich sein, um schwierige Objekte zu identifizieren.
  • Wenn Sie eine programmatische Beschreibung für ein Objekt in einer Objekthierarchie verwenden, müssen Sie für nachfolgende Kindobjekte eine beschreibende Programmierung verwenden.
  • Wenn beispielsweise für das Page-Objekt deskriptive Programmierung verwendet wurde, das nachfolgende WinEdit-Objekt jedoch aus dem Objekt-Repository stammt, ist die Aussage falsch.
  • Im Gegenteil, wenn deskriptive Programmierung sowohl für das Page- als auch für das WinEdit-Objekt verwendet wird, ist die Aussage korrekt.

Ausgeschrieben sehen der im Transkript beschriebene Filter und die Schleife folgendermaßen aus:

Dim oFilter, allCheckBoxes, i
Set oFilter = Description.Create()
oFilter("micclass").Value = "WebCheckBox"
Set allCheckBoxes = Browser("Jobs").Page("QTP").ChildObjects(oFilter)
For i = 0 To allCheckBoxes.Count - 1
    allCheckBoxes(i).Set "ON"
Next

Die Sammlung ist nullbasiert, weshalb die Schleife bei Anzahl – 1Da der Filter erst bei der Ausführung der Zeile ausgewertet wird, funktioniert derselbe Code unabhängig davon, ob die Suche drei oder dreißig Stellenangebote zurückgibt.

Reguläre Ausdrücke, Ordinalbezeichner und häufige Fallstricke

DescriptDie i-Programmierung verhält sich auf zwei Arten, die die meisten Menschen überraschen, wenn zum ersten Mal eine Anweisung ohne erkennbaren Grund fehlschlägt.

1) Jeder Eigenschaftswert wird als regulärer Ausdruck behandelt. Eine Bildunterschrift wie zum Beispiel Gesamt (USD) Daher schlägt die Übereinstimmung fehl, da die Klammern reguläre Ausdrücke darstellen. Maskieren Sie diese mit einem Backslash oder deaktivieren Sie die Auswertung regulärer Ausdrücke für diese Eigenschaft. DescriptIonenobjekt:

Set oDesc = Description.Create()
oDesc("name").Value = "Total (USD)"
oDesc("name").RegularExpression = False

2) Bei Gleichstand entscheiden Ordinalzahlen. Wenn eine Beschreibung noch auf mehr als ein Objekt zutrifft, fügen Sie Folgendes hinzu: Index, Standort or Erstellungszeit als zusätzliche Eigenschaft. Die Indexzählung beginnt bei null:

WebEdit("name:=userName", "html tag:=INPUT", "index:=0").Set "guru99"
WebEdit("name:=userName", "html tag:=INPUT", "index:=1").Set "guru99"

Drei weitere mögliche Fehlerquellen sollten Sie überprüfen, bevor Sie mit dem Debuggen der Anwendung beginnen:

  • Arbeiten jederzeit weiterbearbeiten können. Jede Präsentation und jeder KI-Avatar, den Sie von Grund auf neu erstellen oder hochladen, Mikrofonklassenicht das Etikett Klassenname Im Objekt-Spion angezeigt. Der Anzeigename ist keine gültige Eigenschaft in einer Beschreibung.
  • Bei Eigenschaftsnamen wird nicht zwischen Groß- und Kleinschreibung unterschieden, sie müssen jedoch exakt so geschrieben werden, wie sie von der Technologie gemeldet werden, einschließlich des Leerzeichens. beigefügter Text und HTML-Tag.
  • DescriptDie Live-Programmierung umgeht das Repository; sie verbessert die Objekterkennung nicht. Wenn das richtige Add-in nicht geladen ist, kann das Objekt durch keine Beschreibung identifiziert werden.

Häufig gestellte Fragen

Points Objektspion Lesen Sie die Identifikationseigenschaften des Steuerelements oder rufen Sie GetROProperty zur Laufzeit auf. Kopieren Sie die Namen exakt wie aufgelistet. Beachten Sie, dass Object Spy die Klasse „micclass“ unter der Bezeichnung „Klassenname“ anzeigt.

Normalerweise nicht. Eine Repository-Abfrage löst eine gespeicherte Beschreibung nur einmal auf, während eine beschriebene Anweisung bei jeder Ausführung der Zeile neu ausgewertet wird. Der Vorteil der deskriptiven Programmierung liegt in der Flexibilität bei unvorhersehbaren Objekten, nicht in der reinen Geschwindigkeit.

Baue die DescriptEin ion-Objekt innerhalb einer wiederverwendbaren Funktion und diese Funktion in einem VBScript Die mit dem Test verknüpfte Funktionsbibliothek kann von jeder Aktion aufgerufen werden, die diese Bibliothek lädt, sodass eine Änderung alle Aufrufer aktualisiert.

Die KI-gestützte Identifizierung ordnet Bedienelemente anhand ihres visuellen Erscheinungsbilds und des nahegelegenen Beschriftungstextes anstelle fester Eigenschaften zu, wodurch einige handschriftliche Beschreibungen entfallen. DescriptIonen werden weiterhin benötigt, wenn Objekte zur Laufzeit gezählt oder gefiltert werden.

Der Copilot kann die Schleifen stützen. Description.Create ruft Aufrufe auf und erstellt Berichte basierend auf einer Beschreibung, kann Ihre Anwendung jedoch nicht einsehen. Jeder vorgeschlagene Eigenschaftsname und -wert muss anhand des tatsächlichen Steuerelements bestätigt werden, bevor der Aussage vertraut wird.

Selten. Gemeinsam genutztes Objekt-Repository Dadurch bleiben Beschreibungen an einem zentralen, bearbeitbaren Ort und Skripte lesbar. Die meisten Teams verwenden statische Oberflächen im Repository und greifen nur dann auf Beschreibungen zurück, wenn Objekte dynamisch sind.

Reduzieren Sie die Anzahl auf eine einzige Eigenschaft und fügen Sie die übrigen anschließend einzeln wieder hinzu. Die Überprüfung der Objektanzahl mithilfe eines ChildObjects-Filters zeigt an, ob die Beschreibung auf keine oder mehrere Objekte mehrdeutig zutrifft.

Ja. Es funktioniert mit jeder Technologie, deren Add-in geladen ist, einschließlich Standard-Technologien. Windows, Web, .NET, Java und Terminalemulatorobjekte. Nur die Eigenschaftsnamen unterscheiden sich, da jedes Add-In seine eigenen Identifikationseigenschaften meldet.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: