2016-05-02 5 views
0

Ich habe eine sehr dynamische Anwendung mit UFT zu automatisieren. Die Bezeichnungen auf dem Anwendungsbildschirm ändern sich basierend auf der vom Benutzer bereitgestellten Eingabe. Ich habe eine Excel, wo ich den Feldwert für alle möglichen Felder in der Anwendung festgelegt habe. Die Herausforderung besteht darin, dass mein UFT-Skript nur die Feldwerte auswählen soll, für die es den Feldnamen auf dem Bildschirm findet. Jedes Mal, wenn ich das Skript auf der Grundlage der Auswahl aller Felder auf dem Bildschirm ausführen lasse, möchte ich, dass es nur die entsprechenden Werte aus dem Excel-Blatt auswählt und die anderen Werte in diesem Excel-Blatt ignoriert.Wie mache ich mein UFT-Skript überspringt eine Zelle in Excel basierend auf den Etiketten auf dem Anwendungsbildschirm

Eg

Excel hat folgenden vales

Name: Nancy Erhaltung: 8 Hobby: Schreiben Freund: Veronica BFF: Karen

Aber in der Anwendung auf dem Bildschirm nur die folgenden Etiketten erscheinen

Name: Hobby: BFF:

Ich möchte das UFT-Skript die Feldbezeichnung auf dem Bildschirm mit der in Excel vergleichen und wählen Sie diese Werte aus Excel (in diesem Fall Name, Hobby, BFF) und ignorieren Sie die anderen Felder (Note und Freund).

Ist das möglich?

+0

Verwenden Sie die Excel-Datei als eine native QTP-DataTable? Und sind die Felder mit dynamischen Beschriftungen in einer Art Tabelle oder sind sie verschiedene Eingabefelder mit Beschriftungen? –

+0

Ja, es ist möglich.Und wenn Sie einen Beispielcode hinzufügen und Ihre Frage neu formulieren, um etwas spezifischer zu sein, oder sogar besser, fügen Sie einen SSCCE http://www.sscce.org/ hinzu, erhalten Sie ein Feedback, das gezielter ist.) – TheBlastOne

+0

Das stimmt. Verwende Excel-Datei als dataTable. Alle Felder sind Eingabefelder mit Beschriftungen, die eindeutig identifiziert werden können. Bis jetzt habe ich die Feldnamen mit Spalten in Excel verknüpft, um den Wert zu füllen. Was mein Code jedoch nicht tut, ist das Ignorieren von Spalten, für die keine Feldbezeichnung auf dem Bildschirm erscheint. Habe das Visible = True und Visible = False usw. verwendet, aber es versucht immer noch, das Feld zu finden und das Skript nicht zu verwenden. Ich vermute, ich mache irgendwo etwas falsch. – TryingtoAutomate

Antwort

0

Lassen Sie uns Ihre Anwendung verschiedene Editboxen auf einem Formular zur Eingabe präsentiert übernehmen, und Sie das Datatable-Objekt verwenden, um Ihre Excel-Datei zu speichern.

Ok, hier ist, was ich tun würde.

Zuerst ... Ich würde die Objekte in das Object Repository sammeln. Ich würde jedes mögliche Bearbeitungsfeld als separates Objekt (innerhalb eines Objekts für die App selbst) erstellen/aufzeichnen und sicherstellen, dass jedes Objekt eindeutig identifizierbar ist ... (wenn das Bearbeitungsfeld selbst keinen eindeutigen Namen hinter dem Namen hat) Szenen, QTP bietet die Möglichkeit, zu den Beschriftungen neben ihnen zu verknüpfen ...). Wenn die Anwendung lediglich die Bearbeitungsfelder VERBIETT, stellen Sie sicher, dass "Sichtbar = Wahr" eines der identifi zierenden Attribute ist, so dass sie bei Sichtbar = False nicht gefunden werden.

Sobald jedes Objekt im OR ist, dann ist es eine einfache Frage zu überprüfen, ob sie existieren.

'assuming your excel file is already imported as the global DataTable 
if Window("My App").Editbox("Name").exist(0) then Window("My App").Editbox("Name").Set DataTable("Name") 
if Window("My App").Editbox("Grade").exist(0) then Window("My App").Editbox("Grade").Set DataTable("Grade") 
if Window("My App").Editbox("Hobby").exist(0) then Window("My App").Editbox("Hobby").Set DataTable("Hobby") 
if Window("My App").Editbox("Writing Friend").exist(0) then Window("My App").Editbox("Writing Friend").Set DataTable("Writing Friend") 
if Window("My App").Editbox("BFF").exist(0) then Window("My App").Editbox("BFF").Set DataTable("BFF") 

Natürlich ist dieses Beispiel ist ineffizient und leicht aufgerollt werden kann (dh Sie eine UDF machen könnten, und es von einem aus einem Array Schleife Lesefeld Namen nennen ...) Aber es soll dies demonstrieren einfacher Ansatz.

0

Warum nicht einfach

mit
If Obj1.Exist(5) Then 
    Obj1.Set ValueFromExcel1 
End if 

If Obj2.Exist(5) Then 
    Obj2.Set ValueFromExcel2 
End if 
+0

Weil das OP nicht fragt, denke ich. – TheBlastOne

0

Ich stimme dem @theblamone zu, dass Sie einen Code bereitstellen sollten, um Ihre Situation besser zu verstehen. Jedenfalls werde ich versuchen, deine Frage zu beantworten. Das Folgende ist ein Beispiel und Sie können Ihren Code darum herum erstellen. Ich bin nicht sicher, wie die Etiketten in Ihrer Anwendung erscheinen, ich gehe davon aus, dass jedes Etikett separat identifiziert werden kann.

j = Datatable.localsheet.GetRowCount 

For i = 1 to j 
Datatable.LocalSheet.SetCurrentRow i 

vout = trim(Datatable("Excel column name",dtlocalsheet)) 
'Not sure about the following line 
vin = browser().page().Webtable().getcelldata(r,c) 
If not trim(Ucase(vout))= trim(Ucase(vin)) Then 
Datatable("Result",dtlocalsheet) = "Invalid Record" 
Do Until trim(Ucase(vout))= trim(Ucase(vin)) 
i=i+1 
If i > j Then 
ExitAction 
End IF 
Datatable.LocalSheet.SetCurrentRow I 
Datatable("Result",dtlocalsheet) = "Invalid Record" 
vout = trim(Datatable("Excel column name",dtlocalsheet)) 
Loop 
End If 
+0

Sie können eine weitere FOR-Schleife oben auf dieser haben, die Ihnen den richtigen Markennamen je nach Anwendung gibt ... mehr oder weniger sollte der Rest gleich bleiben! – Harman