पेज ऑब्जेक्ट मॉडल (POM) और पेज फैक्ट्री Selenium

पेज ऑब्जेक्ट मॉडल क्या है?

पेज ऑब्जेक्ट मॉडल (POM) एक डिज़ाइन पैटर्न है, जिसका उपयोग परीक्षण स्वचालन में लोकप्रिय रूप से किया जाता है जो वेब UI तत्वों के लिए ऑब्जेक्ट रिपॉजिटरी बनाता है। मॉडल का लाभ यह है कि यह कोड दोहराव को कम करता है और परीक्षण रखरखाव में सुधार करता है।

इस मॉडल के तहत, एप्लिकेशन में प्रत्येक वेब पेज के लिए, एक संबंधित पेज क्लास होना चाहिए। यह पेज क्लास उस वेब पेज के वेबएलिमेंट्स की पहचान करेगा और इसमें पेज विधियाँ भी शामिल होंगी जो उन वेबएलिमेंट्स पर ऑपरेशन करती हैं। इन विधियों का नाम उनके द्वारा किए जा रहे कार्य के अनुसार दिया जाना चाहिए, यानी, यदि कोई लोडर भुगतान गेटवे के प्रकट होने की प्रतीक्षा कर रहा है, तो POM विधि का नाम waitForPaymentScreenDisplay() हो सकता है।

पेज ऑब्जेक्ट मॉडल

पेज ऑब्जेक्ट मॉडल क्यों?

UI स्वचालन प्रारंभ करना Selenium वेबड्राइवर कोई कठिन काम नहीं है। आपको बस एलिमेंट्स ढूँढ़ने हैं, उस पर ऑपरेशन करने हैं।

किसी वेबसाइट में लॉगइन करने के लिए इस सरल स्क्रिप्ट पर विचार करें

पेज ऑब्जेक्ट मॉडल

जैसा कि आप देख सकते हैं, हम केवल तत्वों को ढूंढ रहे हैं और उन तत्वों के लिए मान भर रहे हैं।

यह एक छोटी सी स्क्रिप्ट है। स्क्रिप्ट का रखरखाव आसान लगता है। लेकिन समय के साथ टेस्ट सूट बढ़ता जाएगा। जैसे-जैसे आप अपने कोड में ज़्यादा से ज़्यादा लाइनें जोड़ते हैं, चीज़ें मुश्किल होती जाती हैं।

स्क्रिप्ट रखरखाव के साथ मुख्य समस्या यह है कि यदि 10 अलग-अलग स्क्रिप्ट एक ही पेज एलिमेंट का उपयोग कर रही हैं, तो उस एलिमेंट में किसी भी बदलाव के साथ, आपको सभी 10 स्क्रिप्ट को बदलना होगा। यह समय लेने वाला और त्रुटिपूर्ण है।

स्क्रिप्ट रखरखाव के लिए एक बेहतर तरीका एक अलग क्लास फ़ाइल बनाना है जो वेब तत्वों को खोजेगी, उन्हें भरेगी या उन्हें सत्यापित करेगी। इस क्लास का उपयोग उस तत्व का उपयोग करने वाली सभी स्क्रिप्ट में फिर से किया जा सकता है। भविष्य में, यदि वेब तत्व में कोई बदलाव होता है, तो हमें केवल 1 क्लास फ़ाइल में बदलाव करने की आवश्यकता है, न कि 10 अलग-अलग स्क्रिप्ट में।

इस दृष्टिकोण को पेज ऑब्जेक्ट मॉडल कहा जाता है Seleniumयह कोड को अधिक पठनीय, रखरखाव योग्य और पुन: प्रयोज्य बनाने में मदद करता है।

पेज ऑब्जेक्ट मॉडल

पीओएम के लाभ

  1. पेज ऑब्जेक्ट डिज़ाइन पैटर्न कहता है कि UI में संचालन और प्रवाह को सत्यापन से अलग किया जाना चाहिए। यह अवधारणा हमारे कोड को साफ़ और समझने में आसान बनाती है।
  2. दूसरा लाभ यह है कि ऑब्जेक्ट रिपॉजिटरी परीक्षण मामलों से स्वतंत्र है, इसलिए हम एक ही ऑब्जेक्ट रिपॉजिटरी का उपयोग विभिन्न उपकरणों के साथ अलग-अलग उद्देश्यों के लिए कर सकते हैं। उदाहरण के लिए, हम पेज ऑब्जेक्ट मॉडल को इसमें एकीकृत कर सकते हैं Selenium साथ में TestNG/JUnit कार्यात्मक के लिए परीक्षण और साथ ही JBehave/Cucumber स्वीकृति परीक्षण के लिए।
  3. POM क्लासों में पुन: प्रयोज्य पृष्ठ विधियों के कारण कोड छोटा और अनुकूलित हो जाता है।
  4. विधियों को अधिक यथार्थवादी नाम मिलते हैं जिन्हें यूआई में होने वाले ऑपरेशन के साथ आसानी से मैप किया जा सकता है। यानी यदि बटन पर क्लिक करने के बाद हम होम पेज पर पहुंचते हैं, तो विधि का नाम 'gotoHomePage()' जैसा होगा।

POM का क्रियान्वयन कैसे करें?

सरल POM:

यह पेज ऑब्जेक्ट मॉडल फ्रेमवर्क की मूल संरचना है जहां सभी वेब तत्व AUT और इन वेब तत्वों पर काम करने वाली विधि को एक क्लास फ़ाइल के अंदर बनाए रखा जाता है। सत्यापन जैसे कार्य को परीक्षण विधियों के हिस्से के रूप में अलग किया जाना चाहिए।

POM लागू करें

पूरा उदाहरण

परीक्षण मामला: गुरु99 डेमो साइट पर जाएं।

चरण 1) गुरु99 डेमो साइट पर जाएं

POM लागू करें

चरण 2) होम पेज पर जाँच करें कि “Guru99 Bank” टेक्स्ट मौजूद है या नहीं

POM लागू करें

चरण 3) एप्लीकेशन में लॉग इन करें

POM लागू करें

चरण 4) सत्यापित करें कि होम पेज में “मैनेजर आईडी: डेमो” जैसा टेक्स्ट है

POM लागू करें

यहां हम 2 पृष्ठों से निपट रहे हैं

  1. लॉग
  2. होम पेज (लॉगिन करने पर दिखाया गया)

तदनुसार, हम 2 POM बनाते हैं Selenium कक्षाएं

गुरु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 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 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();        
    }

}

गुरु99 होम पेज POM in 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();

        }

}

गुरु99 सरल POM में 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("http://demo.guru99.com/V4/");

    }

    /**

     * This test case will login in http://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("manger id : mgr123"));

    }

पेज फैक्ट्री क्या है? Selenium?

पेज फैक्ट्री में Selenium के लिए एक इनबिल्ट पेज ऑब्जेक्ट मॉडल फ्रेमवर्क अवधारणा है Selenium WebDriver लेकिन यह बहुत अनुकूलित है। इसका उपयोग पेज ऑब्जेक्ट्स को आरंभ करने या पेज ऑब्जेक्ट को स्वयं इंस्टेंटिएट करने के लिए किया जाता है। इसका उपयोग “FindElement/s” का उपयोग किए बिना पेज क्लास तत्वों को आरंभ करने के लिए भी किया जाता है।

यहाँ भी, हम पेज ऑब्जेक्ट रिपॉजिटरी और टेस्ट मेथड्स को अलग करने की अवधारणा का पालन करते हैं। इसके अतिरिक्त, पेजफैक्ट्री क्लास की मदद से Selenium, हम एनोटेशन का उपयोग करते हैं @फाइंडबाय WebElement को खोजने के लिए। हम वेब तत्वों को आरंभ करने के लिए initElements विधि का उपयोग करते हैं

पेज फैक्ट्री में Selenium

@फाइंडबाय स्वीकार कर सकते हैं टैगनाम, आंशिकलिंकटेक्स्ट, नाम, लिंकटेक्स्ट, आईडी, सीएसएस, क्लासनाम, एक्सपथ विशेषताओं के रूप में.

आइये पेज फैक्ट्री का उपयोग करके ऊपर दिए गए उदाहरण को देखें

पेज फैक्ट्री के साथ गुरु99 लॉगिन पेज

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();           

    }

}

पेज फैक्ट्री के साथ गुरु99 होम पेज

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();

        }

}

पेज फैक्ट्री अवधारणा के साथ गुरु99 टेस्टकेस

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("http://demo.guru99.com/V4/");

    }

    /**

     * This test go to http://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("manger id : mgr123"));

    }

}

संपूर्ण परियोजना संरचना चित्र की तरह दिखाई देगी:

पेज फैक्ट्री में Selenium

AjaxElementLocatorफैक्ट्री

AjaxElementLocatorफैक्ट्री पेजफैक्ट्री में एक आलसी लोडिंग अवधारणा है Seleniumइसका उपयोग केवल वेब तत्वों को खोजने के लिए किया जाता है जब तत्वों का उपयोग किसी भी ऑपरेशन में किया जाता है। यह ऑब्जेक्ट पेज क्लास को WebElements के लिए टाइमआउट असाइन करता है। PageFactory पैटर्न का उपयोग करने के प्रमुख लाभों में से एक Selenium AjaxElementLocatorFactory क्लास है.

यहाँ, जब किसी तत्व पर कोई ऑपरेशन किया जाता है तो उसकी दृश्यता के लिए प्रतीक्षा उसी क्षण से शुरू होती है। यदि तत्व दिए गए समय अंतराल में नहीं मिलता है, परीक्षण का मामला निष्पादन 'NoSuchElementException' अपवाद फेंक देगा.

AjaxElement लोकेटर फैक्ट्री

सारांश

  1. पेज ऑब्जेक्ट मॉडल Selenium वेबड्राइवर एक ऑब्जेक्ट रिपोजिटरी डिज़ाइन पैटर्न है।
  2. Selenium पेज ऑब्जेक्ट मॉडल हमारे परीक्षण कोड को रखरखाव योग्य, पुन: प्रयोज्य बनाता है।
  3. पेज फैक्ट्री, पेज ऑब्जेक्ट मॉडल फ्रेमवर्क अवधारणा में ऑब्जेक्ट रिपोजिटरी बनाने का एक अनुकूलित तरीका है।
  4. AjaxElementLocatorFactory, पेज फैक्ट्री में एक आलसी लोड अवधारणा है - पेज ऑब्जेक्ट डिज़ाइन पैटर्न जो वेबएलिमेंट्स को केवल तभी पहचानता है जब उनका किसी ऑपरेशन में उपयोग किया जाता है।

डाउनलोड Selenium इस ट्यूटोरियल में डेमो के लिए प्रोजेक्ट फ़ाइलें