نموذج كائن الصفحة والمصنع في Selenium

⚡ ملخص ذكي

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

  • المبدأ الأساسي: تتوافق كل صفحة تطبيق مع فئة صفحة مخصصة تحتوي على عناصر الويب والإجراءات التي يتم تنفيذها عليها، مما يتيح الفصل الواضح بين بنية واجهة المستخدم ومنطق الاختبار.
  • التركيز على التنفيذ: يعمل POM على تعزيز إدارة العناصر القابلة لإعادة الاستخدام والمركزية - تتطلب التعديلات على عناصر الصفحة تحديثات في فئة واحدة فقط بدلاً من البرامج النصية المتعددة.
  • ميزة التصميم: يضمن النموذج مستودعات كائنات أنظف وقابلة للتعديل ومستقلة عن الأدوات ويمكن دمجها مع أطر عمل مثل TestNG, JUnit, Cucumber، أو JBehave.
  • اصطلاح التسمية: يجب أن تعكس الأساليب الموجودة داخل فئات الصفحة إجراءات واجهة المستخدم الفعلية (على سبيل المثال، gotoHomePage())، مما يعزز الوضوح الدلالي في سير عمل الأتمتة.
  • هيكل معزز: يقوم Page Factory بتحسين POM باستخدام @FindBy التعليقات التوضيحية و PageFactory.initElements() لتهيئة WebElement تلقائيًا، مما يؤدي إلى التخلص من التكرار findElement المكالمات.
  • تحسين الأداء: AjaxElementLocatorFactory يقدم تحميلًا كسولًا - يتم تحديد موقع العناصر فقط عند الوصول إليها - مما يحسن كفاءة التنفيذ والتعامل مع سلوك الصفحة الديناميكية بسلاسة.
  • النتيجة: يؤدي النهج الموحد إلى إنشاء بنية أتمتة اختبار قابلة للصيانة والقراءة والتوسع ومتوافقة مع التقنيات الحديثة Selenium الممارسات.

نموذج كائن الصفحة

ما هو نموذج كائن الصفحة؟ ما هي مكوناته الرئيسية؟

نموذج كائن الصفحة (POM) هو نمط تصميم شائع الاستخدام في أتمتة الاختبارات، يُنشئ مستودعًا للكائنات لعناصر واجهة المستخدم على الويب. تكمن ميزة هذا النموذج في تقليل تكرار الكود وتحسين صيانة الاختبارات.

في هذا النموذج، يجب أن يكون لكل صفحة ويب في التطبيق فئة صفحة مقابلة. تُحدد هذه الفئة عناصر الويب الخاصة بصفحة الويب، وتحتوي أيضًا على دوال الصفحة التي تُجري عمليات على هذه العناصر. يجب تسمية هذه الدوال حسب المهمة التي تؤديها، على سبيل المثال، إذا كان المُحمّل ينتظر ظهور بوابة الدفع، فيمكن أن يكون اسم دالة POM هو waitForPaymentScreenDisplay().

المكونات الرئيسية لنموذج كائن الصفحة

  • فئات الصفحات: تمثيل كل صفحة ويب كفئة منفصلة.
  • المواقع: قم بتحديد عناصر الويب باستخدام معرفات أو XPaths أو محددات CSS.
  • الأساليب: تحتوي على الإجراءات أو العمليات التي تم إجراؤها على عناصر الصفحة.
  • إعادة الاستخدام: Promoإعادة استخدام كود tes والصيانة الأسهل عبر الاختبارات.
  • فصل الاهتمامات: يحافظ على بنية الصفحة مستقلة عن منطق الاختبار لتحسين التنظيم.

نموذج كائن الصفحة

لماذا نموذج كائن الصفحة؟

بدء أتمتة واجهة المستخدم في Selenium ويب درايفر ليست مهمة صعبة. كل ما عليك فعله هو العثور على العناصر وإجراء العمليات عليها.

فكر في هذا النص البسيط لتسجيل الدخول إلى موقع الويب.

نموذج كائن الصفحة

كما ترون، كل ما نقوم به هو العثور على العناصر وملء القيم لتلك العناصر.

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

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

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

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

 نموذج كائن الصفحة

👉 سجل مجانًا للبث المباشر Selenium مشروع

مزايا بوم

  1. يقول نمط تصميم كائن الصفحة إن العمليات والتدفقات في واجهة المستخدم يجب أن تكون منفصلة عن التحقق. هذا المفهوم يجعل الكود الخاص بنا أكثر وضوحًا وسهولة في الفهم.
  2. الميزة الثانية هي أن مستودع الكائنات مستقل عن حالات الاختبار، ما يسمح لنا باستخدام مستودع الكائنات نفسه لأغراض مختلفة باستخدام أدوات مختلفة. على سبيل المثال، يمكننا دمج نموذج كائن الصفحة في Selenium مع TestNG/JUnit للوظيفة الاختبار وفي نفس الوقت مع JBehave/Cucumber لاختبار القبول.
  3. Code يصبح أقل حجماً وأكثر كفاءة لأنه يعيد استخدام طرق الصفحة في فئات POM.
  4. تحصل الأساليب على أسماء أكثر واقعية يمكن ربطها بسهولة بالعملية التي تحدث في واجهة المستخدم. على سبيل المثال، إذا انتقلنا إلى الصفحة الرئيسية بعد النقر على الزر، فسيكون اسم الطريقة مثل 'gotoHomePage()'.

كيفية تنفيذ POM في Selenium?

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

تنفيذ بوم

مثال كامل

حالة اختبار: انتقل إلى البرنامج المساعد في التأليف Guru99 موقع تجريبي.

الخطوة 1) اذهب إلى Guru99 موقع تجريبي

تنفيذ بوم

الخطوة الثانية) في الصفحة الرئيسية، تأكد من أن النص "Guru"بنك 99" موجود

تنفيذ بوم

الخطوة 3) تسجيل الدخول إلى التطبيق

تنفيذ بوم

الخطوة 4) تأكد من أن الصفحة الرئيسية تحتوي على نص باسم "معرف المدير: العرض التوضيحي"

تنفيذ بوم

في هذا المثال، نحن نتعامل مع صفحتين:

  1. صفحة الدخول
  2. الصفحة الرئيسية (تظهر بمجرد تسجيل الدخول)

وفقا لذلك، نقوم بإنشاء 2 POM في Selenium فصول

Guruصفحة تسجيل الدخول 99 POM

package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99Login {
    WebDriver driver;
    By user99GuruName = By.name("uid");
    By password99Guru = By.name("password");
    By titleText =By.className("barone");
    By login = By.name("btnLogin");
    public Guru99Login(WebDriver driver){
        this.driver = driver;
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        driver.findElement(user99GuruName).sendKeys(strUserName);
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
         driver.findElement(password99Guru).sendKeys(strPassword);
    }
    //Click on the login button
    public void clickLogin(){
            driver.findElement(login).click();
    }
    //Get the title of Login Page
    public String getLoginTitle(){
     return    driver.findElement(titleText).getText();
    }
    /**
     * This POM method allows the test case to perform the login operation
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();        
    }
}

Guru99 الصفحة الرئيسية POM في Selenium

package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
    WebDriver driver;
    By homePageUserName = By.xpath("//table//tr[@class='heading3']");
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
    }
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    driver.findElement(homePageUserName).getText();
        }
}

Guru99 وصفة طبية بسيطة Selenium حالة اختبار

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage;
    @BeforeTest
    public void setup(){
	System.setProperty("webdriver.gecko.driver", driverPath);        
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test case will login in https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }

ما هو مصنع الصفحة في Selenium?

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

وهنا أيضًا، نتبع مفهوم الفصل بين مستودع كائنات الصفحة وطرق الاختبار. بالإضافة إلى ذلك، بمساعدة فئة PageFactory في Selenium، نستخدم التعليقات التوضيحية @البحث عن طريق للعثور على WebElement. نستخدم طريقة initElements لتهيئة عناصر الويب.

مصنع الصفحة في Selenium

@البحث عن طريق تستطيع القبول tagName، PartialLinkText، name، linkText، id، CSS، className، xpath كسمات.

دعونا نلقي نظرة على نفس المثال المذكور أعلاه باستخدام Page Factory

Guruصفحة تسجيل الدخول 99 باستخدام Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
    /**
     * All WebElements are identified by @FindBy annotation
     */
    WebDriver driver;
    @FindBy(name="uid")
    WebElement user99GuruName;
    @FindBy(name="password")
    WebElement password99Guru;    
    @FindBy(className="barone")
    WebElement titleText;
    @FindBy(name="btnLogin")
    WebElement login;
    public Guru99Login(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        user99GuruName.sendKeys(strUserName);     
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
    password99Guru.sendKeys(strPassword);
    }
    //Click on login button
    public void clickLogin(){
            login.click();

    }  
    //Get the title of Login Page
    public String getLoginTitle(){
     return    titleText.getText();
    }
    /**
     * This POM method will be exposed in test case to login in the application
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();           
    }
}

Guruالصفحة الرئيسية رقم 99 مع Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99HomePage {
    WebDriver driver;
    @FindBy(xpath="//table//tr[@class='heading3']")
    WebElement homePageUserName;    
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }   
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    homePageUserName.getText();
        }
}

Guru99 حالة اختبار باستخدام مفهوم مصنع الصفحات

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage; 
    @BeforeTest
    public void setup(){
        System.setProperty("webdriver.gecko.driver", driverPath);       
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test go to https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }
}

سيبدو هيكل المشروع الكامل مثل الرسم التخطيطي:

مصنع الصفحة في Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory هو مفهوم التحميل البطيء لـ PageFactory في Seleniumيُستخدم للعثور على عناصر الويب فقط عند استخدامها في أي عملية. يُعيّن مهلة زمنية لعناصر الويب لفئة صفحة الكائن. إحدى المزايا الرئيسية لاستخدام نمط PageFactory في Selenium هي فئة AjaxElementLocatorFactory.

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

مصنع محدد موقع AjaxElement

فمثلا:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

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

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

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

In Seleniumيُمثِّل POM كل صفحة ويب كفئة مُخصَّصة تحتوي على مُحدِّدات مواقع وإجراءات. وهو يُغلِّف عناصر واجهة المستخدم، مما يُمكِّن نصوص الاختبار من البقاء مُستقلة عن تغييرات بنية الصفحة الأساسية.

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

POM هو مبدأ تصميمي يُنمذج فيه كل صفحة ويب كفئة ذات محددات وأساليب محددة. يفصل هذا المبدأ منطق الاختبار عن عناصر واجهة المستخدم، مما يُحسّن قابلية القراءة والتوسع والصيانة طويلة الأمد.

يحدد مخطط هيكل الصفحة (POM) بنية التصميم لـ abs الصفحةtracبينما توفر Page Factory التعليقات والأساليب (@FindBy) لتهيئة عناصر الويب بكفاءة. Page Factory هو تحسين لتطبيق POM.

يُجمّع POM محدّدات العناصر وإجراءات الصفحات ضمن فئات مُخصّصة. يتطلّب أي تعديل في واجهة المستخدم تحديثات في مكان واحد فقط، مما يُقلّل من إعادة العمل، ويُحسّن إعادة استخدام الكود، ويُسرّع صيانة الاختبارات.

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

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

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