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: