كيفية استيراد البيانات وقراءتها وتغييرها من برنامج إكسل QTP/UFT
⚡ ملخص ذكي
استيراد البيانات وقراءتها وتغييرها من برنامج Excel في QTP/UFT يعتمد على كائن DataTable المدمج، والذي يقوم بتحميل مصنف في جدول بيانات وقت التشغيل بحيث يمكن لكل برنامج نصي للأتمتة تشغيل خطوات الاختبار من صفوف جدول البيانات.
لا تزال جداول البيانات هي المكان الأكثر شيوعًا الذي يحتفظ فيه المختبرون بقيم الإدخال والنتائج المتوقعة وإعدادات البيئة. QTP، تُباع الآن باسم OpenText UFT بعد انتقال المنتج من شركة HP إلى شركة Micro Focus ثم إلى OpenTextيقرأ هذا البرنامج جداول البيانات من خلال كائن DataTable. توضح الأقسام التالية التعليمات البرمجية المستخدمة لاستيراد مصنف، وحساب صفوفه، وقراءة الخلايا الفردية، وتغيير القيم، وكتابة الورقة مرة أخرى على القرص.
خطوات استيراد البيانات وقراءتها وتغييرها من EXCEL
ضع في اعتبارك أنك تريد استيراد ما يلي Sales.xls أضف كتاب التمارين إلى اختبارك.
بمجرد استيراد الملف إلى UFTيصبح الصف العلوي عنوان العمود، لذا قم بتنظيم بياناتك وفقًا لذلك. يتم التعامل مع أي شيء في الصف 1 كاسم معلمة بدلاً من بيانات اختبار، ويتم احتساب كل صف متبقٍ كصف بيانات.
يتم عرض صيغة استيراد ملف Excel كامل أدناه.
DataTable.Import(FileName)
في حالتنا، تصبح العبارة كما يلي. لا يحتاج VBScript إلى أقواس عند استدعاء دالة كعبارة، لذا يتم استخدام الصيغة البسيطة هنا.
DataTable.Import "D:\Automation\Sales.xls"
بعد التشغيل، تظهر الصفوف المستوردة في جزء بيانات وقت التشغيل تمامًا كما تم ترتيبها في المصنف.
فيما يلي شرح لصيغة استيراد ورقة عمل معينة. SheetSource هل هي الورقة الموجودة داخل المصنف و SheetDest هي ورقة الوجهة في جدول بيانات وقت التشغيل.
DataTable.ImportSheet FileName, SheetSource, SheetDest
استخدم الحصول على عدد الصفوف طريقة للحصول على عدد صفوف البيانات في ورقة العمل. يجب أن يكون كل سطر منفصلاً.
DataTable.Import "D:\Automation\Sales.xls" row = DataTable.GetSheet(1).GetRowCount MsgBox row
يعرض مربع الرسالة الذي يظهر إجمالي عدد الصفوف في الورقة المستوردة.
لنقل المؤشر إلى صف معين، استخدم تعيين الصف الحالي الطريقة. الوسيط الثاني لـ DataTable.Value هو رقم الورقة، وليس رقم الصف، ولهذا السبب يجب تحريك مؤشر الصف بشكل منفصل.
DataTable.Import "D:\Automation\Sales.xls" ' In the code below, 1 is the sheet number DataTable.SetCurrentRow 1 Row1 = DataTable.Value("Year", 1) DataTable.SetCurrentRow 2 Row2 = DataTable.Value("Year", 1) MsgBox "Year Row 1 = " & Row1 & " Year Row 2 = " & Row2
تُقرأ القيمتان من نفس العمود ولكن من صفين مختلفين، ويقوم مربع الرسائل بطباعتهما جنبًا إلى جنب.
استخدم بعد التخفيض تُستخدم الطريقة الموجودة على يسار مهمة التعيين لتغيير البيانات في الورقة المستوردة. يبقى التغيير في الذاكرة حتى يتم استدعاؤه. تصدير، والذي يقوم بكتابة جدول بيانات وقت التشغيل مرة أخرى إلى ملف Excel.
DataTable.SetCurrentRow 1 DataTable.Value("Year", 1) = 2026 DataTable.Export "D:\Automation\Sales_Updated.xls"
تظهر الخلية التي تم تعديلها في جزء البيانات أثناء التشغيل مباشرة بعد تشغيل عملية التعيين.
يؤكد فتح المصنف المصدر أن القيم المعدلة قد تم حفظها على القرص بدلاً من الاحتفاظ بها فقط طوال مدة التشغيل.
💡 نصيحة: قم بالتصدير إلى اسم ملف مختلف عن اسم الملف الذي استوردته. الكتابة مرة أخرى إلى نفس المصنف المفتوح هي أسرع طريقة للتسبب في انتهاك مشاركة الملفات وفقدان عملية التشغيل.
كيفية قراءة بيانات Excel وتغييرها وتصديرها: مثال كامل
توضح كل من المقاطع البرمجية أعلاه طريقة واحدة. في اختبار حقيقي يعتمد على البيانات، يتم دمجها في حلقة واحدة تتنقل بين كل صف، وتحسب قيمة ما، وتخزن النتيجة، ثم تصدر ورقة العمل. لنفترض أن لدينا مصنفًا Sales.xls يحتوي على الأعمدة الأربعة التالية وثلاثة صفوف من البيانات.
| السنة | المنطقة | الوحدات | السعر |
|---|---|---|---|
| 2023 | الشرق | 120 | 25 |
| 2024 | الشرق | 150 | 25 |
| 2025 | West Side | 200 | 30 |
يُضيف النص البرمجي أدناه ربح يقوم بتعبئة العمود صفًا تلو الآخر، ويحتفظ بمجموع تراكمي، ويكتب الورقة النهائية في ملف جديد. AddParameter يتم استخدام هذا لأن العمود غير موجود في المصنف المصدر؛ استدعاءه لعمود موجود بالفعل يؤدي إلى ظهور خطأ.
' Read, calculate and export Excel data in UFT One Dim sh, rowCount, i, units, price, revenue, total DataTable.Import "D:\Automation\Sales.xls" Set sh = DataTable.GetSheet(1) sh.AddParameter "Revenue", "" rowCount = sh.GetRowCount Print "Total rows imported: " & rowCount total = 0 For i = 1 To rowCount DataTable.SetCurrentRow i units = DataTable.Value("Units", 1) price = DataTable.Value("Price", 1) revenue = CInt(units) * CInt(price) DataTable.Value("Revenue", 1) = revenue total = total + revenue Print "Row " & i & " | Year: " & DataTable.Value("Year", 1) & _ " | Region: " & DataTable.Value("Region", 1) & _ " | Revenue: " & revenue Next Print "Grand Total Revenue: " & total DataTable.Export "D:\Automation\Sales_Revenue.xls" Set sh = Nothing
الإخراج:
Total rows imported: 3 Row 1 | Year: 2023 | Region: East | Revenue: 3000 Row 2 | Year: 2024 | Region: East | Revenue: 3750 Row 3 | Year: 2025 | Region: West | Revenue: 6000 Grand Total Revenue: 12750
ثلاث نقاط في هذا النص أهم من غيرها. أولاً، GetRowCount تُرجع الدالة القيمة 3 بدلاً من 4 لأن صف العناوين يُستخدم كأسماء أعمدة. ثانياً، SetCurrentRow يتم استدعاء هذه الدالة في بداية كل تكرار؛ فبدونها، ستقرأ التكرارات الثلاثة جميعها نفس الصف. ثالثًا، القيم الخارجة من جدول البيانات عبارة عن سلاسل نصية، لذا CInt يتم تطبيقها قبل عملية الضرب لتجنب دمج السلاسل النصية بدلاً من العمليات الحسابية. تخطيping DataTable.Export سيؤدي ذلك إلى إظهار الإيرادات المحسوبة في جزء البيانات ولكنها ستختفي من أي ملف على القرص.
كائن DataTable مقابل كائن Excel COM في UFT
لا يُعد كائن DataTable الطريقة الوحيدة للوصول إلى جدول البيانات. UFT يمكن للبرامج النصية أيضًا إنشاء Excel.Application كائن COM والتحكم المباشر في برنامج Excel. كلا النهجين يحلان مشاكل مختلفة.
| البعد | كائن DataTable | كائن COM في Excel |
|---|---|---|
| تثبيت برنامج Excel | غير مطلوب على جهاز التنفيذ | Microsoft يجب تثبيت برنامج Excel |
| أسلوب المخاطبة | حسب اسم العمود ومؤشر الصف | باستخدام إحداثيات الخلايا، أو النطاقات، أو النطاقات المسماة |
| التكرارات | تقوم الصفوف بتشغيل تكرارات الاختبار تلقائيًا | لا يوجد رابط للتكرارات؛ انظرping يدوي |
| التنسيق والصيغ | تم تجاهلها؛ يتم قراءة القيم فقط | إمكانية الوصول الكامل إلى الصيغ والألوان والرسوم البيانية |
| عدة مصنفات عمل | جدول تشغيل واحد، يتم استيراد الأوراق واحدة تلو الأخرى | يمكن فتح أي عدد من المصنفات في وقت واحد |
| تقرير النتائج | تظهر القيم في UFT تشغيل النتائج تلقائيًا | لا يتم تسجيل أي شيء إلا إذا قمت بالإبلاغ عنه بنفسك. |
| عبء التنظيف | أنجز من قبل UFT | يجب عليك إغلاق كل عنصر والخروج منه وتحريره |
القاعدة العملية بسيطة. استخدم كائن DataTable لتخصيص المعلمات بشكل مباشر، حيث يصبح كل صف في جدول البيانات تكرارًا واحدًا لـ اختبار الأتمتة قم بتشغيل البرنامج. استخدم كائن COM فقط عندما تحتاج إلى شيء لا يمكن لجدول البيانات التعبير عنه، مثل قراءة نتيجة صيغة، أو كتابة تقرير منسق، أو مقارنة مصنفين في نفس البرنامج النصي. يقرأ المثال أدناه خلية واحدة، ويكتب حالة، ثم يغلق برنامج Excel بشكل صحيح.
Dim xlApp, xlBook, xlSheet, cellValue Set xlApp = CreateObject("Excel.Application") xlApp.Visible = False xlApp.DisplayAlerts = False Set xlBook = xlApp.Workbooks.Open("D:\Automation\Sales.xls") Set xlSheet = xlBook.Worksheets("Sheet1") cellValue = xlSheet.Cells(2, 1).Value Print "Cell A2 contains: " & cellValue xlSheet.Cells(2, 5).Value = "Reviewed" xlBook.Save ' Release everything, in this order xlBook.Close False xlApp.Quit Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing
الإخراج:
Cell A2 contains: 2023
تحتوي الخلية A2 على القيمة 2023 لأن الصف 1 من ورقة العمل هو صف العناوين والعمود A هو السنةلاحظ أن عنونة COM تبدأ من 1 وتحسب رأس الرسالة، بينما DataTable.SetCurrentRow 1 يشير إلى صف البيانات الأول.
الأخطاء الشائعة عند استخدام برنامج Excel مع UFT وكيفية اصلاحها
معظم مشاكل برنامج إكسل في UFT تنشأ هذه الأخطاء من مجموعة صغيرة من الأخطاء المتكررة. إن التعرف عليها يوفر الكثير من وقت تصحيح الأخطاء.
⚠️ تحذير: يُعدّ وجود عملية EXCEL.EXE معلّقة التأثير الجانبي الأكثر شيوعًا لأتمتة COM. كل CreateObject("Excel.Application") هذا لا يتطابق مع Quit المزيد Set … = Nothing يُبقي البرنامج نسخة مخفية من برنامج Excel قيد التشغيل. بعد بضع مئات من عمليات التشغيل التجريبية، ينفد ذاكرة جهاز التنفيذ، ويصبح المصنف المصدر غير قابل للتعديل.
- يبقى برنامج إكسل في الذاكرة. أغلق المصنف، ثم اتصل
xlApp.Quitثم قم بتحرير ورقة العمل، وملف العمل، وكائنات التطبيق بهذا الترتيب. تحرير التطبيق أولاً يُبقي مرجعاً نشطاً ويُحافظ على استمرار العملية. - تختفي التغييرات بعد انتهاء التشغيل.
DataTable.Valueيكتب إلى جدول بيانات وقت التشغيل فقط. بدونDataTable.Exportلا شيء يصل إلى نظام الملفات. - "العمود غير موجود" أو خطأ في المعلمة غير الصالحة. اسم العمود الذي تم تمريره إلى
DataTable.Valueيجب أن يتطابق تمامًا مع خلية العنوان، بما في ذلك المسافات اللاحقة. استخدمAddParameterلإنشاء عمود قبل الكتابة إليه. - كل تكرار يقرأ نفس القيم.
SetCurrentRowلم يتم استدعاء الدالة داخل الحلقة، لذلك لم يتحرك مؤشر الصف أبدًا. - يُحتسب الخطأ بمقدار صف واحد.
GetRowCountباستثناء صف العناوين. المصنف الذي يحتوي على عنوان وعشرة سجلات يُرجع 10، وليس 11. - فشل في المسار والأذونات. المسارات المبرمجة مسبقًا مثل
D:\Automation\Sales.xlsيحدث عطل على الأجهزة الأخرى. قم بإنشاء المسار من متغير بيئي بحيث يتم تشغيل نفس البرنامج النصي على كل جهاز. - خلايا مدمجة وصفوف عناوين متعددة. تتطلب عملية الاستيراد صفًا واحدًا فقط من العناوين يحتوي على أسماء فريدة. أما دمج الخلايا فينتج عنه أسماء معلمات فارغة أو مكررة.
- انتهاك مشاركة المعلومات المتعلقة بالتصدير. لا يمكن فتح ملف الوجهة في برنامج Excel أثناء
Exportيتم تشغيله. أغلقه أولاً، أو قم بتصديره إلى ملف يحمل اسمًا زمنيًا.
من العادات المفيدة تغليف عملية تنظيف COM في On Error Resume Next تم وضع الكتلة في وظيفة استرداد مخصصة، لذا فإن حدوث عطل في منتصف البرنامج النصي سيؤدي إلى إيقاف تشغيل Excel. عندما تُغذي بيانات Excel وظيفة رسمية حالة اختبار ينطبق نفس المبدأ على النتائج في المستودع: قم بالتصدير مرة واحدة، وتحقق من وجود الملف، ثم قم بإرفاقه بالتشغيل.
للتعمق أكثر في المواضيع التي تم التطرق إليها هنا، يرجى الاطلاع على الكتاب كاملاً. QTP/UFT البرنامج التعليمي أما بالنسبة للإطار الأوسع، فتعلم كيفية دفع النتائج إلى ALM من UFTراجع الأساسيات في اختبار البرمجياتوقارن هذا النهج مع البرمجة النصية القائمة على البيانات في Selenium.







