Σελίδα Object Model & Factory in Selenium

⚡ Έξυπνη Σύνοψη

Μοντέλο Αντικειμένου Σελίδας και Εργοστάσιο Σελίδας στο Selenium ορίζουν ένα δομημένο μοτίβο σχεδίασης για την κατασκευή ισχυρών, συντηρήσιμων πλαισίων αυτοματισμού δοκιμών. Δίνει έμφαση στη δημιουργία κλάσεων συγκεκριμένων σελίδων που ενσωματώνουν τα WebElements και τις συμπεριφορές τους, μειώνοντας έτσι την επικάλυψη και βελτιώνοντας την αναγνωσιμότητα και την επεκτασιμότητα των Selenium σενάρια δοκιμών.

  • Βασική ιδέα: Κάθε σελίδα εφαρμογής αντιστοιχεί σε μια ειδική κλάση σελίδας που περιέχει τόσο τα WebElements όσο και τις ενέργειες που εκτελούνται σε αυτά, επιτρέποντας τον σαφή διαχωρισμό μεταξύ της δομής του UI και της λογικής δοκιμών.
  • Εστίαση στην Υλοποίηση: Το POM προωθεί την επαναχρησιμοποιήσιμη και κεντρική διαχείριση στοιχείων—οι τροποποιήσεις στα στοιχεία σελίδας απαιτούν ενημερώσεις μόνο σε μία κλάση αντί για πολλαπλά σενάρια.
  • Πλεονέκτημα σχεδιασμού: Το μοντέλο εξασφαλίζει καθαρότερα, αρθρωτά και ανεξάρτητα από εργαλεία αποθετήρια αντικειμένων που μπορούν να ενσωματωθούν με πλαίσια όπως TestNG, JUnit, Cucumber, ή JBehave.
  • Σύμβαση Ονοματολογίας: Οι μέθοδοι εντός των κλάσεων σελίδας πρέπει να αντικατοπτρίζουν τις πραγματικές ενέργειες του UI (π.χ. gotoHomePage()), ενισχύοντας τη σημασιολογική σαφήνεια στις ροές εργασίας αυτοματισμού.
  • Βελτιωμένη Δομή: Το Page Factory βελτιώνει το POM χρησιμοποιώντας @FindBy σχολιασμοί και PageFactory.initElements() για αυτόματη αρχικοποίηση WebElement, εξαλείφοντας τις επαναλαμβανόμενες findElement κλήσεις.
  • Βελτιστοποίηση απόδοσης: AjaxElementLocatorFactory Εισάγει την αργή φόρτωση—τα στοιχεία εντοπίζονται μόνο κατά την πρόσβαση—βελτιώνοντας την αποτελεσματικότητα εκτέλεσης και χειριζόμενοι με ομαλό τρόπο τη συμπεριφορά της δυναμικής σελίδας.
  • Αποτέλεσμα: Η ενοποιημένη προσέγγιση έχει ως αποτέλεσμα μια διατηρήσιμη, ευανάγνωστη και κλιμακώσιμη αρχιτεκτονική αυτοματισμού δοκιμών, ευθυγραμμισμένη με τις σύγχρονες Selenium πρακτικές.

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

Τι είναι το μοντέλο αντικειμένου σελίδας; Ποια είναι τα βασικά του στοιχεία;

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

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

Βασικά Στοιχεία του Μοντέλου Αντικειμένου Σελίδας

  • Κατηγορίες σελίδων: Αναπαραστήστε κάθε ιστοσελίδα ως ξεχωριστή κλάση.
  • Εντοπιστές: Προσδιορίστε στοιχεία ιστού χρησιμοποιώντας ID, XPaths ή επιλογείς CSS.
  • Μέθοδοι: Περιέχουν ενέργειες ή λειτουργίες που εκτελούνται στα στοιχεία .page.
  • Επαναχρησιμοποίηση: PromoΕπαναχρησιμοποίηση κώδικα tes και ευκολότερη συντήρηση σε όλες τις δοκιμές.
  • Διαχωρισμός ανησυχιών: Διατηρεί τη δομή της σελίδας ανεξάρτητη από τη λογική των δοκιμών για καλύτερη οργάνωση.

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

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

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

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

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

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

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

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

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

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

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

👉 Εγγραφείτε δωρεάν ζωντανά Selenium ΕΡΓΟ

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

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

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

Απλό PLog στη θεμελιώδη δομή ενός πλαισίου μοντέλου αντικειμένου σελίδας, όπου τα στοιχεία whereManageREIDE του AUT και η μέθοδος που λειτουργεί σε αυτά τα στοιχεία ιστού διατηρείται μέσα σε ένα αρχείο clog. Μια εργασία όπως η επαλήθευση θα πρέπει να είναι ξεχωριστή ως μέρος των μεθόδων δοκιμής.

Εφαρμογή POM

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

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

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

Εφαρμογή POM

Βήμα 2) Στην αρχική σελίδα, ελέγξτε ότι το κείμενο «Guru99 Bank” είναι παρούσα

Εφαρμογή POM

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

Εφαρμογή POM

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

Εφαρμογή POM

Σε αυτό το παράδειγμα, έχουμε να κάνουμε με δύο σελίδες:

  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 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 Απλό 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("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"));
    }

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

Page Factory in Selenium είναι μια ενσωματωμένη έννοια πλαισίου μοντέλου αντικειμένου σελίδας για Selenium WebDriver που βελτιώνει τη συντηρησιμότητα μειώνοντας τις επαναλαμβανόμενες αναζητήσεις στοιχείων χρησιμοποιώντας σχολιασμούς, όχι μέσω της ταχύτητας εκτέλεσης. Χρησιμοποιείται για την αρχικοποίηση αντικειμένων Page ή για τη δημιουργία στιγμιότυπων του ίδιου του αντικειμένου Page. Χρησιμοποιείται επίσης για την αρχικοποίηση στοιχείων κλάσης Page χωρίς τη χρήση του "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("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"));
    }
}

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

Page Factory in Selenium

AjaxElementLocatorFactory

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

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

AjaxElement Locator Factory

Για παράδειγμα:

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

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

Συχνές Ερωτήσεις

Το Μοντέλο Αντικειμένου Σελίδας είναι ένα μοτίβο σχεδίασης πουtracΔιαχωρίζει τα στοιχεία της ιστοσελίδας ts σε ξεχωριστές κλάσεις. Απλοποιεί τον αυτοματισμό διαχωρίζοντας τις αλληλεπιδράσεις του UI από τη λογική των δοκιμών, προωθώντας τη σαφήνεια, την επεκτασιμότητα και τη μειωμένη επανάληψη κώδικα.

In Selenium, το POM αναπαριστά κάθε ιστοσελίδα ως μια ειδική κλάση που περιέχει εντοπιστές και ενέργειες. Ενσωματώνει στοιχεία UI, επιτρέποντας στα σενάρια δοκιμών να παραμένουν ανεξάρτητα από τις υποκείμενες αλλαγές στη δομή της σελίδας.

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

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

Το POM ορίζει τη δομή σχεδίασης για το abs σελίδαςtracση, ενώ το Page Factory παρέχει σχολιασμούς και μεθόδους (@FindBy) για την αποτελεσματική αρχικοποίηση στοιχείων ιστού. Το Page Factory είναι μια βελτίωση υλοποίησης του POM.

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

Ναι. Οι γεννήτριες δοκιμών που βασίζονται στην τεχνητή νοημοσύνη μπορούν να δημιουργήσουν αυτόματα κλάσεις POM αναλύοντας τις ιεραρχίες του UI, διατηρώντας τον λογικό διαχωρισμό των ζητημάτων, επιταχύνοντας παράλληλα τη δημιουργία δοκιμών από άκρο σε άκρο.

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

Συνοψίστε αυτήν την ανάρτηση με: