كيفية استيراد البيانات وقراءتها وتغييرها من برنامج إكسل QTP/UFT

⚡ ملخص ذكي

استيراد البيانات وقراءتها وتغييرها من برنامج Excel في QTP/UFT يعتمد على كائن DataTable المدمج، والذي يقوم بتحميل مصنف في جدول بيانات وقت التشغيل بحيث يمكن لكل برنامج نصي للأتمتة تشغيل خطوات الاختبار من صفوف جدول البيانات.

  • 📥 استيراد: تقوم DataTable.Import بتحميل مصنف كامل، بينما تقوم DataTable.ImportSheet بسحب ورقة واحدة مسماة إلى ورقة وجهة مختارة.
  • 🗂️ قاعدة العنوان: يصبح الصف الأول في جدول البيانات هو أسماء الأعمدة، لذا قم بتنظيم الجدول قبل تشغيل عملية الاستيراد.
  • 🔢 عدد الصفوف: تقوم الدالة DataTable.GetSheet(1).GetRowCount بإرجاع عدد صفوف البيانات وتستثني صف العنوان.
  • 🎯 مؤشر الصف: قم باستدعاء DataTable.SetCurrentRow قبل كل عملية قراءة حتى تُرجع DataTable.Value الخلية التي تتوقعها.
  • ✏️ أرسل ردًا: يؤدي تعيين قيمة لـ DataTable.Value إلى تغيير خلية في الذاكرة فقط؛ بينما يقوم DataTable.Export بحفظ الورقة على القرص.
  • 🧩 خيار الاتصال عبر الهاتف المحمول: قم بإنشاء كائن Excel.Application عند الحاجة إلى التنسيق أو الصيغ أو فتح عدة مصنفات.
  • ⚠️ تنظيف: قم دائمًا باستدعاء Quit وتحرير الكائنات، وإلا سيظل EXCEL.EXE موجودًا ويقفل الملف.

كيفية استيراد البيانات وقراءتها وتغييرها من برنامج Excel QTP/UFT

لا تزال جداول البيانات هي المكان الأكثر شيوعًا الذي يحتفظ فيه المختبرون بقيم الإدخال والنتائج المتوقعة وإعدادات البيئة. QTP، تُباع الآن باسم OpenText UFT بعد انتقال المنتج من شركة HP إلى شركة Micro Focus ثم إلى OpenTextيقرأ هذا البرنامج جداول البيانات من خلال كائن DataTable. توضح الأقسام التالية التعليمات البرمجية المستخدمة لاستيراد مصنف، وحساب صفوفه، وقراءة الخلايا الفردية، وتغيير القيم، وكتابة الورقة مرة أخرى على القرص.

خطوات استيراد البيانات وقراءتها وتغييرها من EXCEL

ضع في اعتبارك أنك تريد استيراد ما يلي Sales.xls أضف كتاب التمارين إلى اختبارك.

تم فتح ملف Sales.xls المصدر في برنامج Excel قبل استيراده إلى UFT

بمجرد استيراد الملف إلى UFTيصبح الصف العلوي عنوان العمود، لذا قم بتنظيم بياناتك وفقًا لذلك. يتم التعامل مع أي شيء في الصف 1 كاسم معلمة بدلاً من بيانات اختبار، ويتم احتساب كل صف متبقٍ كصف بيانات.

يتم عرض صيغة استيراد ملف Excel كامل أدناه.

DataTable.Import(FileName)

في حالتنا، تصبح العبارة كما يلي. لا يحتاج VBScript إلى أقواس عند استدعاء دالة كعبارة، لذا يتم استخدام الصيغة البسيطة هنا.

DataTable.Import "D:\Automation\Sales.xls"

بعد التشغيل، تظهر الصفوف المستوردة في جزء بيانات وقت التشغيل تمامًا كما تم ترتيبها في المصنف.

بيانات المبيعات المستوردة المعروضة في UFT جزء جدول البيانات في وقت التشغيل

فيما يلي شرح لصيغة استيراد ورقة عمل معينة. SheetSource هل هي الورقة الموجودة داخل المصنف و SheetDest هي ورقة الوجهة في جدول بيانات وقت التشغيل.

DataTable.ImportSheet FileName, SheetSource, SheetDest

استخدم الحصول على عدد الصفوف طريقة للحصول على عدد صفوف البيانات في ورقة العمل. يجب أن يكون كل سطر منفصلاً.

DataTable.Import "D:\Automation\Sales.xls"
row = DataTable.GetSheet(1).GetRowCount
MsgBox row

يعرض مربع الرسالة الذي يظهر إجمالي عدد الصفوف في الورقة المستوردة.

جي اسBox عرض نتيجة GetRowCount لورقة المبيعات المستوردة

لنقل المؤشر إلى صف معين، استخدم تعيين الصف الحالي الطريقة. الوسيط الثاني لـ 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

تُقرأ القيمتان من نفس العمود ولكن من صفين مختلفين، ويقوم مربع الرسائل بطباعتهما جنبًا إلى جنب.

جي اسBox مقارنة قيمة السنة في الصف 1 والصف 2 من جدول البيانات

استخدم بعد التخفيض تُستخدم الطريقة الموجودة على يسار مهمة التعيين لتغيير البيانات في الورقة المستوردة. يبقى التغيير في الذاكرة حتى يتم استدعاؤه. تصدير، والذي يقوم بكتابة جدول بيانات وقت التشغيل مرة أخرى إلى ملف Excel.

DataTable.SetCurrentRow 1
DataTable.Value("Year", 1) = 2026
DataTable.Export "D:\Automation\Sales_Updated.xls"

تظهر الخلية التي تم تعديلها في جزء البيانات أثناء التشغيل مباشرة بعد تشغيل عملية التعيين.

جدول بيانات وقت التشغيل الذي يعرض خلية تم تحديثها من خلال طريقة DataTable.Value

يؤكد فتح المصنف المصدر أن القيم المعدلة قد تم حفظها على القرص بدلاً من الاحتفاظ بها فقط طوال مدة التشغيل.

تم فتح ملف Excel المُصدَّر في برنامج Excel، ويظهر فيه القيم المُعدَّلة التي تم حفظها بواسطة DataTable.Export.

💡 نصيحة: قم بالتصدير إلى اسم ملف مختلف عن اسم الملف الذي استوردته. الكتابة مرة أخرى إلى نفس المصنف المفتوح هي أسرع طريقة للتسبب في انتهاك مشاركة الملفات وفقدان عملية التشغيل.

كيفية قراءة بيانات 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.

الأسئلة الشائعة

UFT يستورد البرنامج ملفات بصيغ .xls و .xlsx و .csv إلى جدول بيانات وقت التشغيل. ينتج عن التصدير دائمًا مصنف بصيغة .xls، لذا يلزم وجود محول أو كائن Excel COM عندما يتطلب النظام اللاحق صيغة .xlsx الأحدث.

يُحفظ جدول وقت التصميم مع الاختبار ويبقى دون تغيير. أما جدول وقت التشغيل فهو نسخة تُنشأ عند بدء التنفيذ. وتؤثر عمليات الاستيراد وتعيين القيم على نسخة وقت التشغيل فقط، والتي تُحذف ما لم يتم تصديرها.

لا بالنسبة لكائن DataTable، الذي يقوم بتحليل المصنف نفسه. نعم بالنسبة لأي برنامج نصي يستدعي CreateObject(“Excel.Application”)، لأن هذا المسار يُؤتمت تشغيل نسخة حقيقية من Excel ويفشل فورًا على جهاز لا يحتوي عليها.

نعم. استدعِ دالة ImportSheet مرة واحدة لكل ورقة عمل، مع تغيير اسم ورقة العمل المستهدفة في كل مرة. البيانات العامة تُخزَّن في ورقة العمل العامة، بينما تُخزَّن القيم الخاصة بكل إجراء في ورقة العمل الخاصة بالإجراء، وذلك لضمان استقلالية التكرارات.

نعم، وعادةً ما يكون هيكل الحلقة صحيحًا. تحقق يدويًا من أمرين: أن دالة SetCurrentRow موجودة داخل الحلقة، وأن الخلايا الرقمية تُحوّل باستخدام CInt أو CDbl. غالبًا ما يُهمل الكود المُولّد كلا الأمرين.

ميزات الذكاء الاصطناعي في العصر الحديث UFT تتعرف الإصدارات الجديدة على عناصر التحكم بصريًا، لذا لن يؤدي تغيير اسم الحقل إلى تعطيل كل صف من مجموعة البيانات. كما يمكن للذكاء الاصطناعي اقتراح صفوف حدودية إضافية، مما يوسع نطاق تغطية جداول البيانات دون الحاجة إلى تصميم اختبار يدوي.

تلخيص هذه التدوينة بـ: