2009-06-03 5 views
2

Je souhaite utiliser la reconnaissance d'objet dynamique (programmation descriptive) pour trouver le premier bouton intitulé «Supprimer» qui apparaît après un texte donné (par exemple, le premier bouton Supprimer qui apparaît après le texte "Article XYZ-123"). J'ai une manière kludgy de le faire si le texte et le bouton sont à l'intérieur d'une seule rangée d'une table Web, mais j'espérais une solution plus élégante ou plus fiable (heureusement une qui ne comptera pas sur des tables).Quicktest Pro - trouver le premier bouton après avoir trouvé le texte

Je préférerais éviter d'utiliser la propriété .Object, car la documentation prétend que la propriété .Object renvoie uniquement des objets DOM lorsque vous testez dans IE et non dans firefox.

Merci!

+1

Je suppose que votre kludge est le long de la ligne de Browser(). WebElement ("tag html: = TR ..."). WebButton ("value: = Supprimer")? Je pense en fait que c'est une bonne façon logique de faire les choses, dommage que cela ne semble pas fonctionner sur Firefox. A défaut, je pense que la solution de Motti ci-dessous est raisonnable. Et pour ne pas utiliser .Object: de nombreuses solutions de contournement peuvent être utilisées pour obtenir des fonctionnalités similaires sur FF, mais à moins que ce soit désespérément important, je trouve plus intéressant de passer du temps à écrire des scripts supplémentaires pour IE que de contourner les inconsistances de FF. dans QTP. – Xiaofu

Répondre

1

Voici une solution qui utilise l'attribut sourceIndex, notez que sourceIndex est une propriété d'IE uniquement mais QTP la simule sur Firefox afin que le même script fonctionne sur les deux navigateurs. Vous pouvez choisir d'utiliser des propriétés basées sur des coordonnées comme abs_x et abs_y si source_index ne correspond pas à la facture.

Le code qui suit répond à la question a demandé, 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 

choses à noter à propos de cette solution:

  • Il ne suppose rien sur l'élément contenant le texte, si vous savez que c'est le texte entier dans l'élément, vous pouvez supprimer le .* s et/ou ajouter un "tag html" pour de meilleures performances.
    • Voilà pourquoi nous prenons le dernier élément qui correspond à la description, le premier élément sera le BODY etc.
  • Dans la description du texte que nous devons préciser « micclass » = « WebElement » car par défaut ChildObject filtre WebElement s en supposant qu'ils ne sont pas intéressants. Permettez-moi de reformuler la question en commençant par
+0

Merci! C'est parfait. –

1

En supposant qu'il n'existe pas de méthode plus simple, vous pouvez essayer d'analyser le code HTML. Trouver le texte de recherche dans le code HTML, et commencer à chercher le code HTML à partir de ce point pour un bouton "Supprimer". Vous devriez être capable de tirer un identifiant ou une autre propriété d'identification du code HTML que vous pouvez utiliser pour la programmation descriptive.

Avez-vous des exemples de code HTML et QTP que nous pourrions consulter pour avoir plus de détails? Peut-être qu'il y a un moyen plus facile.

0

Comment récupérer la référence à un objet contenu dans WebTable si le numéro de ligne est inconnu mais que vous avez une valeur de clé unique pour trouver la ligne?

Cela s'applique aux boutons, aux cases à cocher, aux listes déroulantes et à tout autre objet de la table.

Implémentation.

1) Trouver rangée

intRow = objWebTable.GetRowWithCellText (sKeyValueText, "Item") 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écifiez colonne par numéro seulement. Le dernier paramètre entre en vigueur si vous avez plus d'un bouton dans la même cellule.

Vérifiez d'autres exemples techniques dans mon blog (http://automationbeyond.wordpress.com/).

+0

Pas nécessairement dans une table - bien que ce soit une attente commune. De plus, trouver la bonne table à l'intérieur pourrait poser un problème sur les pages dynamiques qui montrent un nombre variable de tables. Je suis à la recherche d'une solution généralisée, donc la recherche d'objets dans une table aurait du sens, mais je devrais permettre la possibilité que dans certains cas je regarde en dehors des tables ... –

+0

Vérifiez si les tables ont la propriété id html (qui est unique en valeur par page) défini. Dans ce cas, vous n'aurez aucun problème pour identifier la table. Dans l'ensemble, je suis préoccupé par le fait que vous pouvez vraiment avoir une solution généralisée fiable sans identifier la bonne table car le contexte du texte/bouton que vous recherchez est tout aussi important. Si votre script trouve le bon texte dans la mauvaise table et le signale comme PASS, cela vaut même la peine. –

Questions connexes