QuickTest Pro - trouver premier bouton après le texte correspondant
-
09-09-2019 - |
Question
Je veux utiliser la reconnaissance d'objets dynamique (programmation descriptive) pour trouver le premier bouton « Supprimer » qui se produit après un texte donné (par exemple, le premier bouton Supprimer qui apparaît après le texte « Point XYZ-123 »). J'ai un moyen kludgy de le faire si le texte et le bouton sont à l'intérieur d'une seule ligne d'un WebTable, mais j'espérais une solution plus élégante ou fiable (je l'espère qui ne sera pas compter sur les tables).
Je préférerais éviter d'utiliser la propriété .object, puisque la documentation affirme que la propriété .object retourne uniquement les objets DOM lorsque vous testez dans les IE, et non dans Firefox.
Merci!
La solution
Voici une solution qui utilise l'attribut sourceIndex
, notez que sourceIndex
est un IE seule propriété mais QTP simule sur Firefox pour le même script fonctionnera sur les deux navigateurs. Vous pouvez choisir d'utiliser les propriétés de coordonnées sur la base comme abs_x
et abs_y
si source_index
ne correspond pas à la facture.
Le code qui suit répond à la question posée, en faire une fonction générale est laissée en exercice pour le lecteur; o)
''#1. Create description for locator text
Set textD = Description.Create()
textD("micclass").Value = "WebElement"
textD("innertext").Value = ".*Item XYZ-123.*"
''#2. Find locator sourceIndex
set texts = Browser("B").Page("P").ChildObjects(textD)
Set text = texts(texts.Count-1) ' Take last text '
textIdx = text.GetROProperty("source_index") ' works for FF too '
''#3. Create description for button
Set buttonD = Description.Create()
buttonD("micclass").Value = "WebButton"
buttonD("value").Value = "Delete"
Set btns = Browser("B").Page("P").ChildObjects(buttonD)
''#4. Find first button after locator text
For i = 0 To btns.Count
If btns(i).GetROProperty("source_index") > textIdx Then
btns(i).Click ' Or whatever you want to do with it '
Exit For
End If
Next
Les choses à noter à propos de cette solution:
- Il ne suppose rien sur l'élément contenant le texte, si vous savez que cela est tout le texte dans l'élément que vous pouvez supprimer les
.*
s et / ou ajouter un pour une performance bien meilleure « balise html ».- C'est pourquoi nous prenons le dernier élément qui correspond à la description, le premier élément sera le
BODY
etc.
- C'est pourquoi nous prenons le dernier élément qui correspond à la description, le premier élément sera le
- Dans la description du texte que nous devons préciser « micclass » = « WebElement » car par défaut
ChildObject
filtre lesWebElement
s en supposant qu'ils sont non-intéressant.
Autres conseils
En supposant qu'il n'y a pas un moyen plus facile de le faire, vous pouvez essayer analyser le code HTML. Trouvez le texte de recherche dans le code HTML, et commencer à chercher le code HTML à partir de ce moment-là en avant pour un bouton « Supprimer ». Vous devriez être en mesure de tirer une carte d'identité ou d'une autre propriété identifiant du code HTML que vous pouvez utiliser pour la programmation descriptive.
Avez-vous des échantillons du code HTML et QTP que nous pourrions examiner pour voir plus de détails? Peut-être il y a un moyen plus facile.
Permettez-moi de reformuler la question.
Comment récupérer référence à un objet contenu dans WebTable si le numéro de ligne est inconnu, mais vous avez une valeur clé unique pour trouver la ligne?
Cela vaut pour les boutons, cases à cocher, comboboxes et tout autre objet dans le tableau.
La mise en œuvre.
1) Trouver rangée
intRow = objWebTable.GetRowWithCellText (sKeyValueText, "élément") Vous pouvez spécifier la colonne par nom ou numéro
2) Retreive objet enfant
Set objButton = objWebTable.ChildItem (intRow, intCol, "Webbutton", 0) Vous pouvez spécifier la colonne par numéro. Le dernier paramètre entre en vigueur si vous avez plus d'un bouton à la même cellule.
Vérifiez d'autres exemples techniques dans mon blog ( http://automationbeyond.wordpress.com/ ) .