DescriptProgrammation interactive dans QTP/UFT: Dynamique et statique

⚡ Résumé intelligent

DescriptLa programmation interactive permet à QTP or UFT Une instruction contient la description de l'objet elle-même, sous forme de paires propriété-valeur ou sous forme de DescriptL'objet ion permet donc d'exécuter une étape même si l'objet n'a jamais été stocké dans le référentiel d'objets.

  • (I.e. Contourne le dépôt : La description est intégrée à l'instruction, il n'est donc pas nécessaire de rechercher le nom de l'objet lors de l'exécution.
  • ☑️ Forme statique : Les paires de valeurs de propriété sont écrites en ligne sous la forme « propriété:=valeur », séparées par des virgules à l'intérieur de l'appel de l'objet de test.
  • ✅ Formulaire dynamique : Description.Create construit une collection de propriétés réutilisables que plusieurs instructions peuvent partager.
  • 🧪 Conçu pour les objets imprévisibles : Panneaux à masquage automatique, hiérarchies changeantes, objets internes imbriqués et ensembles de résultats de taille inconnue.
  • ️ Les objets enfants sont associés à celui-ci : A DescriptL'objet ion utilisé comme filtre ne renvoie que les enfants correspondants d'un parent.
  • 📌 Deux règles à retenir : Chaque valeur de propriété est traitée comme une expression régulière, et une fois que vous décrivez un parent, vous devez également décrire ses enfants.

Instructions de programmation descriptive statiques et dynamiques dans QTP et UFT Un

Qu'est-ce que le DescriptProgrammation ive ?

Descriptprogrammation vivante est utilisé pour exécuter des opérations sur un objet de l'AUT dont la définition n'est pas stockée dans le Référentiel d'objetsGrâce à ce mécanisme, vous pouvez contourner l'identification à partir du référentiel d'objets et fournir l'objet. Description dans la déclaration elle-même.

Le nom d'un objet sert simplement à associer un objet d'un script à sa description dans un référentiel d'objets. Ainsi, même si vous modifiez le nom de l'objet à la fois dans votre script et dans le référentiel, le script devrait s'exécuter. Visionnez la vidéo suivante pour en savoir plus sur ce concept.

Cliquez à nouveau ici si la vidéo n'est pas accessible

Extraits vidéo

  • Supprimer l'objet DescriptImpossible de saisir le nom de l'agent dans la zone de texte WinEdit du référentiel d'objets. Si vous relancez le test, il échouera, car l'objet est introuvable. Examinons la raison de cet échec.
  • Pendant l'exécution, UFT On identifie l'opération effectuée sur la boîte WinEdit, et l'objet DescriptL'élément dans le référentiel d'objets est stocké sous le nom de l'agent. Il utilise ce nom pour track l'objet dans le référentiel d'objets. Pour un parent, vous ne pouvez pas avoir deux objets enfants portant le même nom, donc QTP Il établit une correspondance unique entre l'objet et le référentiel. Il utilise ensuite la description stockée dans le référentiel d'objets, remplace le nom par cette description et utilise l'instruction résultante pour identifier l'objet dans l'application testée.
  • Comme dans notre cas nous avions complètement supprimé cette description d'objet, le script échoue.
  • Mais que se passerait-il si, au lieu de QTP En remplaçant la description de l'objet, vous, en tant que testeur, spécifiez directement les descriptions des objets dans votre script ? Ce n'est rien d'autre que « … »DescriptProgrammation ive »

Ce simple changement de responsabilité est ce que mettent en œuvre les deux formulaires ci-dessous, et chaque formulaire convient à un type de scénario différent.

Types d' DescriptProgrammation ive

Vous pouvez utiliser Descriptprogrammation ive de deux manières

  1. Statique
  2. Dynamique

Statique DescriptProgrammation ive

Dans la méthode statique, pour l'identification d'un objet, vous spécifiez la propriété d'un objet au format suivant

property:=values,

Ce format est appelé paire propriété-valeur et est encadré par des guillemets. Écrite en toutes lettres, une instruction statique ressemble à ceci :

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

Si votre objet utilise plusieurs descriptions pour son identification, vous pouvez les spécifier à l'aide de virgules.

Ainsi, dans notre cas, la description du nom de l'agent devient

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

Les descriptions statiques sont lues au moment de l'exécution de l'instruction, ce qui les rend idéales pour les étapes ponctuelles et les corrections rapides d'un script que vous ne souhaitez pas réenregistrer.

Dynamique DescriptProgrammation ive

La deuxième méthode pour effectuer la même action consiste à utiliser Dynamic Descriptprogrammation vivante

Dans le cas où votre script utilise plusieurs fois l'objet de programmation descriptif candidat, il sera très fastidieux de spécifier toutes les paires de valeurs de propriété pour chaque instruction.

Dans de tels cas, vous pouvez utiliser DescriptClasse d'ions fournie par QTP

La syntaxe pour créer un objet de description est :

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

Il s'agit de la méthode dynamique

Renseigner cet objet avec les propriétés Nom de l'agent utilisées ci-dessus permet d'obtenir une description complète et réutilisable :

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

La variable oDesc peut désormais être transmis à n'importe quelle instruction qui a besoin de cet objet, de sorte qu'une modification met à jour chaque étape qui l'utilise.

Statique vs Dynamique DescriptProgrammation interactive : quand utiliser chaque

Les deux formats produisent la même description d'exécution ; le choix porte donc sur la maintenance plutôt que sur les fonctionnalités.

Critères Statique (en ligne) Dynamique (Descriptobjet ionique)
Comment la description est rédigée Les paires de valeurs de propriété typées dans l'appel d'objet de test Propriétés ajoutées à un objet créé avec Description.Créer()
Réutilisation Répété dans chaque instruction nécessitant l'objet Stocké dans une variable et transmis partout où cela est nécessaire.
lisibilité Les phrases courtes restent lisibles ; les longues deviennent difficiles à manier. Lignes de configuration supplémentaires, mais l'instruction elle-même reste courte.
Modifications en cours d'exécution Les valeurs sont fixes sauf si elles sont concaténées à partir de variables. Les valeurs des propriétés peuvent être réattribuées avant chaque utilisation.
Fonctionne avec les objets enfants Non, l'argument de filtre doit être un Descriptobjet ionique Oui, il s'agit du formulaire requis
Meilleur adapté à Une ou deux étapes sur un objet qui n'est pas dans le dépôt Objets utilisés de manière répétée ou collections récupérées lors de l'exécution

Pourquoi utiliser DescriptProgrammation ive ?

La transcription ci-dessous accompagne la vidéo présentant un scénario réel où le nombre d'objets ne peut être connu à l'avance.

Transcription de la vidéo

  • La question à un million de dollars est de savoir pourquoi utiliser DP alors que le processus d'identification des objets est géré par QTP
  • Supposons que vous soyez chargé de tester un portail d'emploi. Vous effectuez une recherche sur le portail, et le test prévoit que vous sélectionniez toutes les offres d'emploi disponibles et cliquiez sur « Postuler ».
  • Mais le nombre d'offres d'emploi affichées dépendra de la requête de recherche et des offres disponibles au moment de l'exécution du script, et il n'existe aucun moyen de prédire à l'avance le nombre d'offres qui seront affichées.
  • Dans ce genre de cas, vous pouvez utiliser la programmation descriptive. Même si vous ne connaissez pas le nombre et les noms des cases à cocher, vous connaissez la classe des objets : « WebCheck ».Box »
  • Vous pouvez utiliser le méthode ChildObjects pour renvoyer des objets appartenant à un parent particulier
  • Une ligne de code comme –
    Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()

    renverra tous les objets enfants de cette page.

  • Mais nous voulons seulement WebCheckBox objets. Pour ce faire, nous pouvons créer un objet filtre et définir sa propriété sur la classe de case à cocher Web, puis passer ce filtre comme argument à la méthode ChildObjects.
  • Dans ce cas, seules les cases à cocher sont renvoyées.
  • Ensuite, vous pouvez écrire un code comme celui-ci, qui accède à l'ensemble de la collection de cases à cocher en commençant par zéro et active toutes les cases à cocher.
  • Ensuite, vous pouvez cliquer sur le bouton Appliquer pour terminer le test
  • Vous pouvez également utiliser Descriptive Programmation pour exécuter des objets difficiles à enregistrer comme les panneaux de masquage automatique, les objets avec des hiérarchies changeantes, les objets internes imbriqués, les sous-menus.
  • Vous pouvez également effectuer des manipulations avancées de chaînes à l'aide de la programmation descriptive.
  • Associée à la propriété d'index, la programmation descriptive pourrait s'avérer très utile pour identifier les objets difficiles.
  • Si vous utilisez une description programmatique pour un objet dans une hiérarchie d'objets, vous devrez utiliser une programmation descriptive pour les objets enfants suivants.
  • Par exemple, si la programmation descriptive a été utilisée pour l'objet Page mais que l'objet enfant WinEdit suivant provient du référentiel d'objets, l'affirmation est incorrecte.
  • Au contraire, lorsque la programmation descriptive est utilisée à la fois pour les objets Page et WinEdit, l'affirmation est correcte.

Une fois écrits, le filtre et la boucle décrits dans la transcription ressemblent à ceci :

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

La collection est indexée à partir de zéro, c'est pourquoi la boucle s'arrête à Compte – 1. Étant donné que le filtre est évalué lors de l'exécution de la ligne, le même code fonctionne, que la recherche renvoie trois ou trente offres d'emploi.

Expressions régulières, identificateurs ordinaux et pièges courants

DescriptLa programmation interactive se comporte de deux manières qui surprennent la plupart des gens la première fois qu'une instruction échoue sans raison apparente.

1) Chaque valeur de propriété est traitée comme une expression régulière. Une légende telle que Total (USD) Par conséquent, la correspondance échoue car les parenthèses font partie de la syntaxe des expressions régulières. Échappez-les avec une barre oblique inverse ou désactivez l'évaluation des expressions régulières pour cette propriété. Descriptobjet ionique :

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

2) Les identifiants ordinaux permettent de départager les égalités. Lorsqu'une description correspond encore à plusieurs objets, ajoutez indice, Localisation or temps de création comme propriété supplémentaire. L'index commence à zéro :

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

Il convient de vérifier trois autres pièges avant de commencer le débogage de l'application :

  • Utilisez le classe de micro, pas l'étiquette Nom du cours Affiché dans Object Spy. Le nom d'affichage n'est pas une propriété valide dans une description.
  • Les noms de propriétés ne sont pas sensibles à la casse, mais doivent être orthographiés exactement comme le système les indique, y compris l'espace. texte joint et balise HTML.
  • DescriptLa programmation interactive contourne le référentiel ; elle n’améliore pas la reconnaissance des objets. Si le module complémentaire approprié n’est pas chargé, aucune description ne permettra d’identifier l’objet.

FAQ

Point Objet Espion Consultez le contrôle et lisez ses propriétés d'identification, ou appelez GetROProperty lors de l'exécution. Copiez les noms exactement tels qu'ils apparaissent, en gardant à l'esprit que Object Spy affiche micclass sous l'étiquette Nom de la classe.

En général, non. Une recherche dans un référentiel résout une description stockée une seule fois, tandis qu'une instruction décrite est évaluée à chaque exécution de la ligne. L'avantage de la programmation descriptive réside dans la flexibilité face aux objets imprévisibles, et non dans la vitesse pure.

Construire les Descriptun objet ion à l'intérieur d'une fonction réutilisable et conserver cette fonction dans un VBScript Bibliothèque de fonctions associée au test. Toute action chargeant cette bibliothèque peut ensuite l'appeler ; ainsi, une modification met à jour tous les appelants.

L'identification assistée par l'IA fait correspondre les commandes par leur apparence visuelle et le texte de l'étiquette à proximité plutôt que par des propriétés fixes, ce qui supprime certaines descriptions manuscrites. DescriptDes ions sont toujours nécessaires lorsque des objets sont comptés ou filtrés lors de l'exécution.

Le copilote peut étayer les boucles, Description.Create génère des appels et des rapports à partir d'une description, mais ne peut pas accéder à votre application. Chaque nom et valeur de propriété suggérés doivent être confirmés par rapport au contrôle réel avant que l'affirmation ne soit considérée comme fiable.

Rarement. A dépôt d'objets partagé Cela permet de centraliser les descriptions et de rendre les scripts lisibles. La plupart des équipes conservent les écrans stables dans le dépôt et ne consultent les descriptions que pour les objets dynamiques.

Réduisez-la à une seule propriété, puis ajoutez les autres une à une. Vérifier le nombre d'objets avec un filtre ChildObjects permet de déterminer si la description ne correspond à aucun objet ou si elle correspond à plusieurs objets de manière ambiguë.

Oui. Cela fonctionne pour toute technologie dont le module complémentaire est chargé, y compris les technologies standard. Windows, web, .NET, Java et les objets de l'émulateur de terminal. Seuls les noms des propriétés diffèrent, chaque module complémentaire renvoyant ses propres propriétés d'identification.

Résumez cet article avec :