Page Object Model (POM) & Page Factory in Selenium

Τι είναι το Model Object Model;

Μοντέλο αντικειμένου σελίδας (POM) είναι ένα μοτίβο σχεδίασης, που χρησιμοποιείται ευρέως στον αυτοματισμό δοκιμών που δημιουργεί Αποθετήριο αντικειμένων για στοιχεία διεπαφής χρήστη ιστού. Το πλεονέκτημα του μοντέλου είναι ότι μειώνει την αντιγραφή κώδικα και βελτιώνει τη συντήρηση της δοκιμής.

Σύμφωνα με αυτό το μοντέλο, για κάθε ιστοσελίδα στην εφαρμογή, θα πρέπει να υπάρχει μια αντίστοιχη κατηγορία σελίδας. Αυτή η κλάση Σελίδα θα προσδιορίσει τα WebElements αυτής της ιστοσελίδας και επίσης περιέχει μεθόδους Page που εκτελούν λειτουργίες σε αυτά τα WebElements. Το όνομα αυτών των μεθόδων θα πρέπει να δίνεται σύμφωνα με την εργασία που εκτελούν, δηλαδή, εάν ένας φορτωτής περιμένει να εμφανιστεί η πύλη πληρωμής, το όνομα της μεθόδου POM μπορεί να είναι waitForPaymentScreenDisplay().

Μοντέλο αντικειμένου σελίδας

Γιατί το μοντέλο αντικειμένου σελίδας;

Έναρξη αυτοματισμού διεπαφής χρήστη Selenium Το WebDriver ΔΕΝ είναι δύσκολο έργο. Απλά πρέπει να βρείτε στοιχεία, να εκτελέσετε λειτουργίες σε αυτό.

Σκεφτείτε αυτό το απλό σενάριο για να συνδεθείτε σε έναν ιστότοπο

Μοντέλο αντικειμένου σελίδας

Όπως μπορείτε να παρατηρήσετε, το μόνο που κάνουμε είναι να βρίσκουμε στοιχεία και να συμπληρώνουμε τιμές για αυτά τα στοιχεία.

Αυτό είναι ένα μικρό σενάριο. Η συντήρηση σεναρίου φαίνεται εύκολη. Αλλά με το χρόνο η σουίτα δοκιμών θα μεγαλώσει. Καθώς προσθέτετε όλο και περισσότερες γραμμές στον κώδικά σας, τα πράγματα γίνονται δύσκολα.

Το κύριο πρόβλημα με τη συντήρηση σεναρίων είναι ότι εάν 10 διαφορετικά σενάρια χρησιμοποιούν το ίδιο στοιχείο σελίδας, με οποιαδήποτε αλλαγή σε αυτό το στοιχείο, πρέπει να αλλάξετε και τα 10 σενάρια. Αυτό είναι χρονοβόρο και επιρρεπές σε σφάλματα.

Μια καλύτερη προσέγγιση στη συντήρηση του σεναρίου είναι η δημιουργία ενός ξεχωριστού αρχείου κλάσης που θα βρίσκει στοιχεία ιστού, θα τα συμπληρώνει ή θα τα επαληθεύει. Αυτή η κλάση μπορεί να επαναχρησιμοποιηθεί σε όλα τα σενάρια που χρησιμοποιούν αυτό το στοιχείο. Στο μέλλον, εάν υπάρξει αλλαγή στο στοιχείο web, θα πρέπει να κάνουμε την αλλαγή σε 1 μόνο αρχείο κλάσης και όχι σε 10 διαφορετικά σενάρια.

Αυτή η προσέγγιση ονομάζεται Page Object Model in Selenium. Βοηθά να γίνει ο κώδικας πιο ευανάγνωστος, διατηρήσιμος και επαναχρησιμοποιήσιμος.

Μοντέλο αντικειμένου σελίδας

Πλεονεκτήματα του POM

  1. Το μοτίβο σχεδίασης αντικειμένου σελίδας λέει ότι οι λειτουργίες και οι ροές στη διεπαφή χρήστη πρέπει να διαχωρίζονται από την επαλήθευση. Αυτή η ιδέα κάνει τον κώδικά μας πιο καθαρό και κατανοητό.
  2. Το δεύτερο πλεονέκτημα είναι ότι το αποθετήριο αντικειμένων είναι ανεξάρτητο από δοκιμαστικές περιπτώσεις, επομένως μπορούμε να χρησιμοποιήσουμε το ίδιο αποθετήριο αντικειμένων για διαφορετικό σκοπό με διαφορετικά εργαλεία. Για παράδειγμα, μπορούμε να ενσωματώσουμε το μοντέλο αντικειμένου σελίδας Selenium με TestNG/JUnit για λειτουργικό Δοκιμές και ταυτόχρονα με το JBehave/Cucumber για δοκιμές αποδοχής.
  3. Ο κώδικας μειώνεται και βελτιστοποιείται λόγω των επαναχρησιμοποιήσιμων μεθόδων σελίδας στις κλάσεις POM.
  4. Οι μέθοδοι λαμβάνουν πιο ρεαλιστικά ονόματα που μπορούν εύκολα να αντιστοιχιστούν με τη λειτουργία που συμβαίνει στο περιβάλλον χρήστη. δηλ. εάν πατήσουμε το κουμπί στην αρχική σελίδα, το όνομα της μεθόδου θα είναι σαν 'gotoHomePage()'.

Πώς να εφαρμόσετε το POM;

Απλό POM:

Είναι η βασική δομή του πλαισίου μοντέλου αντικειμένου σελίδας όπου όλα τα Στοιχεία Ιστού του AUT και η μέθοδος που λειτουργεί σε αυτά τα Στοιχεία Ιστού διατηρούνται μέσα σε ένα αρχείο κλάσης. Μια εργασία όπως η επαλήθευση θα πρέπει να είναι ξεχωριστή ως μέρος των μεθόδων δοκιμής.

Εφαρμογή POM

Πλήρες Παράδειγμα

δοκιμαστική θήκη: Μεταβείτε στον ιστότοπο επίδειξης Guru99.

Βήμα 1) Μεταβείτε στον ιστότοπο επίδειξης Guru99

Εφαρμογή POM

Βήμα 2) Στην αρχική σελίδα υπάρχει το κείμενο ελέγχου «Guru99 Bank».

Εφαρμογή POM

Βήμα 3) Συνδεθείτε στην εφαρμογή

Εφαρμογή POM

Βήμα 4) Βεβαιωθείτε ότι η αρχική σελίδα περιέχει κείμενο ως "Αναγνωριστικό Manger: επίδειξη"

Εφαρμογή POM

Εδώ έχουμε να κάνουμε με 2 σελίδες

  1. Είσοδος σελίδας
  2. Αρχική σελίδα (εμφανίζεται μόλις συνδεθείτε)

Αντίστοιχα, δημιουργούμε 2 POM in Selenium τάξεις

Guru99 Σελίδα σύνδεσης 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();        
    }

}

Αρχική σελίδα Guru99 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();

        }

}

Guru99 Simple POM in 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"));

    }

Σε τι βρίσκεται το Page Factory Selenium?

Page Factory in Selenium είναι μια ενσωματωμένη έννοια πλαισίου μοντέλου αντικειμένου σελίδας για Selenium WebDriver αλλά είναι πολύ βελτιστοποιημένο. Χρησιμοποιείται για την προετοιμασία των αντικειμένων Σελίδας ή για την προετοιμασία του ίδιου του αντικειμένου Σελίδας. Χρησιμοποιείται επίσης για την προετοιμασία στοιχείων κλάσης Σελίδας χωρίς τη χρήση "FindElement/s".

Και εδώ, ακολουθούμε την έννοια του διαχωρισμού του χώρου αποθήκευσης αντικειμένων σελίδας και των μεθόδων δοκιμής. Επιπλέον, με τη βοήθεια της κλάσης PageFactory in Selenium, χρησιμοποιούμε σχολιασμούς @FindBy για να βρείτε το WebElement. Χρησιμοποιούμε τη μέθοδο initElements για την προετοιμασία στοιχείων ιστού

Page Factory In Selenium

@FindBy μπορεί να δεχθεί tagName, partalLinkText, name, linkText, id, css, className, xpath ως ιδιότητες.

Ας δούμε το ίδιο παράδειγμα με το παραπάνω χρησιμοποιώντας το Page Factory

Σελίδα σύνδεσης Guru99 με το 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();           

    }

}

Αρχική σελίδα Guru99 με το 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 TestCase με έννοια Page Factory

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

    }

}

Η πλήρης δομή του έργου θα μοιάζει με το διάγραμμα:

Page Factory in Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory είναι μια χαλαρή ιδέα φόρτωσης του PageFactory στο Selenium. Χρησιμοποιείται για την εύρεση των στοιχείων Ιστού μόνο όταν τα στοιχεία χρησιμοποιούνται σε οποιαδήποτε λειτουργία. Εκχωρεί ένα χρονικό όριο για τα WebElements στην κλάση σελίδας αντικειμένου. Ένα από τα βασικά πλεονεκτήματα της χρήσης του μοτίβου PageFactory in Selenium είναι η κλάση AjaxElementLocatorFactory.

Εδώ, όταν εκτελείται μια λειτουργία σε ένα στοιχείο, η αναμονή για την ορατότητά του ξεκινά μόνο από εκείνη τη στιγμή. Εάν το στοιχείο δεν βρεθεί στο δεδομένο χρονικό διάστημα, Δοκιμαστική θήκη Η εκτέλεση θα δημιουργήσει εξαίρεση "NoSuchElementException".

AjaxElement Locator Factory

Σύνοψη

  1. Μοντέλο αντικειμένου σελίδας σε Selenium Το WebDriver είναι ένα μοτίβο σχεδίασης αποθήκης αντικειμένων.
  2. Selenium Το μοντέλο αντικειμένου σελίδας δημιουργεί τον κώδικα δοκιμής μας με δυνατότητα συντήρησης, επαναχρησιμοποιήσιμου.
  3. Το Page Factory είναι ένας βελτιστοποιημένος τρόπος δημιουργίας αποθετηρίου αντικειμένων στην έννοια του πλαισίου μοντέλου αντικειμένου σελίδας.
  4. Το AjaxElementLocatorFactory είναι μια έννοια τεμπέλης φόρτωσης στο Page Factory – μοτίβο σχεδίασης αντικειμένων σελίδας για την αναγνώριση WebElements μόνο όταν χρησιμοποιούνται σε οποιαδήποτε λειτουργία.

Κατεβάστε το Selenium Αρχεία έργου για την επίδειξη σε αυτό το σεμινάριο

Περισσότερα readmore