Selenium الإطار: البيانات والكلمات الرئيسية والهجينة

⚡ ملخص ذكي

Selenium إطار العمل: تحدد مناهج البيانات والكلمات المفتاحية والأساليب الهجينة كيفية تنظيم المختبرين لرمز الأتمتة، وفصل بيانات الاختبار، وإعادة استخدام المنطق. تشرح هذه المقالة كل نوع من أنواع أطر العمل، وبنيته، ومزاياه، وكيفية تنفيذه خطوة بخطوة مع أمثلة عملية. Selenium أمثلة على أكواد WebDriver.

  • التعريف الأساسي: A Selenium الإطار هو بنية برمجية منظمة تعمل على تحسين إمكانية إعادة استخدام ونقل وصيانة نصوص الاختبار الآلية.
  • 📊 التنفيذ القائم على البيانات: افصل بيانات الاختبار عن المنطق باستخدام Excel أو CSV أو XML، واقرأ المدخلات من خلال Apache POI (HSSF لـ XLS، XSSF لـ XLSX).
  • 🔑 التصميم القائم على الكلمات المفتاحية: قم بتوجيه إجراءات واجهة المستخدم من خلال جداول الكلمات الرئيسية ومستودعات الكائنات حتى يتمكن المختبرون اليدويون من إنشاء حالات الاختبار دون الحاجة إلى كتابة التعليمات البرمجية. Java رمز.
  • ⚙️ التحسين الهجين: دمج TestNG مزودو البيانات الذين يستخدمون تنفيذ الكلمات الرئيسية لاكتساب المرونة وقابلية التوسع وتقليل تكاليف صيانة البرامج النصية.
  • 🧩 فوائد مستودع الكائنات: قم بتجميع محددات المواقع في ملف خصائص بحيث تتطلب تغييرات العناصر تحديث موقع واحد فقط عبر جميع حالات الاختبار.

Selenium الإطار

ما هي تفاصيل Selenium نطاق؟

استخدم Selenium إطار الأتمتة هو بنية برمجية منظمة تجعل صيانة الاختبارات بسيطة وقابلة للتوسع وفعالة. بدون إطار عمل، غالبًا ما يضع المختبرون التعليمات البرمجية والبيانات في نفس الموقع، مما يجعلها غير قابلة لإعادة الاستخدام وغير مقروءة. يوفر اعتماد إطار عمل فوائد ملموسة مثل زيادة إمكانية إعادة استخدام التعليمات البرمجية، وتحسين قابلية النقل، وتقليل تكلفة صيانة البرامج النصية، وتحسين قابلية القراءة، وفصل أوضح بين منطق الاختبار وبيانات الإدخال.

لماذا تستخدم أ Selenium إطار عمل للأتمتة؟

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

  • قابلية الصيانة: تعني المحددات المركزية وطرق المساعدة أن تغييرًا واحدًا يقوم بتحديث كل اختبار يستخدم هذا العنصر.
  • إعادة الاستخدام: تُكتب العمليات الشائعة مثل تسجيل الدخول أو التنقل أو إدخال النموذج مرة واحدة ويتم استدعاؤها عبر العديد من حالات الاختبار.
  • التدرجية: تصبح إضافة حالات اختبار جديدة بمثابة تحديث للبيانات بدلاً من مهمة برمجة، مما يسمح لغير المطورين بالمساهمة في السيناريوهات.
  • الإبلاغ والتعاون: تسهل البنية الموحدة عملية التكامل مع أدوات إعداد التقارير، وخطوط أنابيب التكامل المستمر/التسليم المستمر، والتحكم في الإصدارات.

انواع من Selenium الإطار

هناك ثلاثة أساسيات أنواع الأطر مبنية على Selenium WebDriver لأتمتة حالات الاختبار اليدوية. يستهدف كل نمط توازناً مختلفاً بين جهد المطور، ومشاركة المختبر، ومرونة البيانات.

  • الإطار المبني على البيانات
  • إطار يحركه الكلمات الرئيسية
  • إطار مدفوع هجين

انواع من Selenium الإطار

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

الإطار المبني على البيانات في Selenium

الإطار المبني على البيانات في Selenium هي طريقة لفصل مجموعات بيانات الاختبار عن منطق حالات الاختبار. بمجرد فصل البيانات، يمكنك تعديل المدخلات لوظيفة معينة دون المساس بشفرة الاختبار. تُستخدم هذه الطريقة عادةً لجلب حالات الاختبار ومجموعات الاختبار من مصادر خارجية مثل Excel.csv، .xml، أو جداول قواعد البيانات.

الإطار المبني على البيانات في Selenium

لقراءة أو كتابة ملفات Excel، توفر Apache مكتبة POI المعروفة. يمكن لهذه المكتبة التعامل مع كليهما XLS و XLSX الأشكال. ال HSSF يقوم التطبيق بقراءة ملفات XLS القديمة، بينما XSSF يدعم التطبيق ملفات XLSX الحديثة.

لقد تناولنا بالفعل موضوع اختبار البيانات في مقالنا السابق. البرنامج التعليمي السابق.

إطار يحركه الكلمات الرئيسية في Selenium

إطار يحركه الكلمات الرئيسية في Selenium هي طريقة تُسرّع عملية الأتمتة من خلال فصل الكلمات المفتاحية للوظائف والتعليمات الشائعة. تُكتب جميع العمليات والتعليمات في ملف خارجي، عادةً ما يكون جدول بيانات إكسل. يمكن للمختبرين تحديد الوظائف التي يرغبون في التحقق من صحتها دون تعديلها. Java الكود، مما يجعل هذا الأسلوب مثالياً للفرق التي يساهم فيها محللو الأعمال أو ضمان الجودة اليدوي في تعريفات الاختبار.

إليكم الشكل الكامل للإطار:

إطار يحركه الكلمات الرئيسية في Selenium

كما ترون، إنه إطار عمل من خمس خطوات. دعونا ندرسه خطوة بخطوة بالتفصيل.

الخطوة 1)

  • يستدعي البرنامج النصي Execute.java الخاص بالسائق الدالة ReadGuru99ExcelFile.java.
  • عرضGuruيحتوي الملف 99ExcelFile.java على كود POI الذي يقرأ البيانات من برنامج Excel.

الخطوة 2)

  • عرضGuruيقوم الملف 99ExcelFile.java بقراءة البيانات من الملف TestCase.xlsx.
  • هذا هو شكل الورقة:

ملف إكسل لإطار عمل الكلمات المفتاحية Selenium

  • استناداً إلى الكلمات الرئيسية المكتوبة في ملف Excel، يقوم الإطار بتنفيذ الإجراء المقابل على واجهة المستخدم.
  • على سبيل المثال، للنقر على زر بعنوان "تسجيل الدخول"، يخزن ملف إكسل الكلمة المفتاحية "انقر". ولتمييز زر "تسجيل الدخول" بين العديد من الأزرار في الصفحة، يُعرّف صف إكسل اسم الكائن باسم loginButton ونوع الكائن باسم name (انظر الصف المظلل في الصورة). يمكن أن يكون نوع الكائن أيضًا XPath أو CSS أو class أو أي استراتيجية تحديد موقع أخرى.

الخطوة 3) عرضGuruيقوم الملف 99ExcelFile.java بإعادة البيانات التي تم تحليلها إلى البرنامج النصي Execute.java.

الخطوة 4)

  • بالنسبة لجميع عناصر واجهة المستخدم على الويب، يمكنك الاحتفاظ بمستودع كائنات يخزن محددات العناصر مثل XPath أو الاسم أو CSS أو اسم الفئة.

مستودع الكائنات في إطار عمل يعتمد على الكلمات المفتاحية

  • يقوم ملف Execute.java (البرنامج النصي الرئيسي) بقراءة مستودع الكائنات بالكامل وتخزينه في متغير.
  • تُعرّف فئة ReadObject المساعدة طريقة getObjectRepository التي تقوم بتحميل المستودع في وقت التشغيل.

فئة مساعدة ReadObject لإطار عمل الكلمات المفتاحية

NOTE: قد تتساءل عن سبب الحاجة إلى مستودع الكائنات. والجواب هو سهولة الصيانة. فإذا استُخدم زرٌّ باسم btnlogin في عشر حالات اختبار، ثم أعاد المطور تسميته إلى submit، فسيتعين عليك تعديل عشرة ملفات. أما مع مستودع الكائنات، فيمكنك تغيير الموضع في مكان واحد فقط.

الخطوة 5)

  • يقوم برنامج التشغيل بتمرير البيانات من برنامج Excel ومستودع الكائنات إلى واجهة المستخدم.Operaفئة tion.
  • UIOperaيحتوي tion على وظائف تربط كل كلمة رئيسية مثل CLICK و SETTEXT بإجراء WebDriver محدد.
  • UIOperation هو Java فئة تحتوي على التنفيذ الفعلي للتفاعل مع عناصر الويب.

UIOperaفئة tion في إطار عمل الكلمات المفتاحية

يبدو هيكل المشروع الكامل كما يلي:

الهيكل الكامل لمشروع إطار العمل القائم على الكلمات المفتاحية

دعونا نلقي نظرة على مثال عملي:

سيناريو الاختبار: نقوم بتنفيذ حالتي اختبار.

  • حالة الاختبار 1:
  • غوتو https://demo.guru99.com/V4/
  • أدخل معرف المستخدم
  • أدخل كلمة المرور
  • انقر فوق إعادة تعيين
  • حالة الاختبار 2:
  • غوتو https://demo.guru99.com/V4/
  • أدخل معرف المستخدم
  • أدخل كلمة المرور
  • انقر فوق تسجيل الدخول

خصائص الموضوع

url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset

عرضGuru99ExcelFile.java

package excelExportAndFileIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadGuru99ExcelFile {
    public Sheet readExcel(String filePath, String fileName, String sheetName) throws IOException {
        // Create a File object to open the xlsx file
        File file = new File(filePath + "\\" + fileName);
        // Create a FileInputStream to read the Excel file
        FileInputStream inputStream = new FileInputStream(file);
        Workbook guru99Workbook = null;
        // Detect the file extension
        String fileExtensionName = fileName.substring(fileName.indexOf("."));
        if (fileExtensionName.equals(".xlsx")) {
            guru99Workbook = new XSSFWorkbook(inputStream);
        } else if (fileExtensionName.equals(".xls")) {
            guru99Workbook = new HSSFWorkbook(inputStream);
        }
        // Read the sheet inside the workbook by its name
        Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);
        return guru99Sheet;
    }
}

ReadObject.java

package operation;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ReadObject {
    Properties p = new Properties();

    public Properties getObjectRepository() throws IOException {
        // Read the object repository file
        InputStream stream = new FileInputStream(new File(System.getProperty("user.dir") + "\\src\\objects\\object.properties"));
        // Load all objects
        p.load(stream);
        return p;
    }
}

UIOperation.java

package operation;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class UIOperation {
    WebDriver driver;

    public UIOperation(WebDriver driver) {
        this.driver = driver;
    }

    public void perform(Properties p, String operation, String objectName, String objectType, String value) throws Exception {
        System.out.println("");
        switch (operation.toUpperCase()) {
            case "CLICK":
                driver.findElement(this.getObject(p, objectName, objectType)).click();
                break;
            case "SETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).sendKeys(value);
                break;
            case "GOTOURL":
                driver.get(p.getProperty(value));
                break;
            case "GETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).getText();
                break;
            default:
                break;
        }
    }

    private By getObject(Properties p, String objectName, String objectType) throws Exception {
        if (objectType.equalsIgnoreCase("XPATH")) {
            return By.xpath(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CLASSNAME")) {
            return By.className(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("NAME")) {
            return By.name(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CSS")) {
            return By.cssSelector(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("LINK")) {
            return By.linkText(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("PARTIALLINK")) {
            return By.partialLinkText(p.getProperty(objectName));
        } else {
            throw new Exception("Wrong object type");
        }
    }
}

ExecuteTest.java

package testCases;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class ExecuteTest {
    @Test
    public void testLogin() throws Exception {
        WebDriver webdriver = new FirefoxDriver();
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        // Read keyword sheet
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        // Find the number of rows in the Excel file
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        for (int i = 1; i < rowCount + 1; i++) {
            Row row = guru99Sheet.getRow(i);
            if (row.getCell(0).toString().length() == 0) {
                System.out.println(row.getCell(1).toString() + "----" + row.getCell(2).toString() + "----" +
                        row.getCell(3).toString() + "----" + row.getCell(4).toString());
                operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
                        row.getCell(3).toString(), row.getCell(4).toString());
            } else {
                System.out.println("New Testcase->" + row.getCell(0).toString() + " Started");
            }
        }
    }
}

بعد التنفيذ، تبدو المخرجات كالتالي:

مخرجات تنفيذ إطار العمل القائم على الكلمات المفتاحية

تحميل Selenium ملفات المشروع للعرض التوضيحي في هذا البرنامج التعليمي

إطار مدفوع هجين

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

هنا، تحتفظ ملفات إكسل بالكلمات المفتاحية لكل خطوة، و TestNGالصورة مزود البيانات يوفر بيانات الاختبار. يتيح لك هذا التقسيم توسيع نطاق كل من مفردات الإجراءات وتنوعات الإدخال بشكل مستقل.

بنية إطار العمل الهجين

بالنسبة لإطار العمل الهجين الخاص بنا، لا يتغير شيء في البنية القائمة على الكلمات الرئيسية: ببساطة نستبدل ExecuteTest.java بـ HybridExecuteTest.java.

استبدال مكونات إطار العمل الهجين

يحتوي ملف HybridExecuteTest هذا على منطق كامل يعتمد على الكلمات المفتاحية بالإضافة إلى TestNGآلية مزود البيانات.

يبدو التمثيل التصويري الكامل للإطار الهجين على النحو التالي:

تمثيل كامل لإطار العمل الهجين

HybridExecuteTest.java

package testCases;
import java.io.IOException;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class HybridExecuteTest {
    WebDriver webdriver = null;

    @Test(dataProvider = "hybridData")
    public void testLogin(String testcaseName, String keyword, String objectName, String objectType, String value) throws Exception {
        if (testcaseName != null && testcaseName.length() != 0) {
            webdriver = new FirefoxDriver();
        }
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        operation.perform(allObjects, keyword, objectName, objectType, value);
    }

    @DataProvider(name = "hybridData")
    public Object[][] getDataFromDataprovider() throws IOException {
        Object[][] object = null;
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        object = new Object[rowCount][5];
        for (int i = 0; i < rowCount; i++) {
            Row row = guru99Sheet.getRow(i + 1);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                object[i][j] = row.getCell(j).toString();
            }
        }
        System.out.println("");
        return object;
    }
}

تحميل Selenium ملفات المشروع للعرض التوضيحي في هذا البرنامج التعليمي

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

اختر "الاختبار القائم على الكلمات المفتاحية" عندما يحتاج المختبرون اليدويون إلى إنشاء حالات اختبار دون كتابة أكواد. اختر "الاختبار القائم على البيانات" عندما يجب تشغيل نفس البرنامج النصي على العديد من متغيرات الإدخال. استخدم "الاختبار الهجين" عندما تحتاج إلى مرونة البيانات وكتابة الاختبارات على مستوى الكلمات المفتاحية في آن واحد.

يقرأ Apache POI ملفات Excel المستخدمة كمصدر للبيانات ويكتبها. يتعامل HSSF مع ملفات .xls القديمة، بينما يعالج XSSF ملفات .xlsx الحديثة. يتيح لك هذان النظامان معًا استخراج مدخلات ديناميكية من جداول البيانات دون الحاجة إلى تضمين البيانات بشكل ثابت في الكود.

يُركّز مستودع الكائنات مُحدِّدات العناصر مثل XPath وCSS والاسم. إذا أعاد مطوّر تسمية عنصر تحكم في واجهة المستخدم، يتم تحديث إدخال واحد فقط بدلاً من كل حالة اختبار، مما يُقلل بشكل كبير من وقت الصيانة وخطر تعطل البرامج النصية.

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

نعم. تقوم مساعدات الذكاء الاصطناعي الحديثة بتحليل التطبيق قيد الاختبار واقتراح مكتبات الكلمات الرئيسية، ونماذج الإدخال، والحالات الاستثنائية. يقوم المختبرون بمراجعة الاقتراحات وتحسينها، مما يُسرّع عملية إعداد إطار العمل مع الحفاظ على...ping الإشراف البشري على منطق التحقق الحاسم.

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