Seite Objektmodell & Fabrik in Selenium

⚡ Intelligente Zusammenfassung

Seitenobjektmodell und Seitenfabrik in Selenium Es definiert ein strukturiertes Entwurfsmuster für die Entwicklung robuster und wartungsfreundlicher Testautomatisierungs-Frameworks. Dabei wird die Erstellung seitenbezogener Klassen betont, die WebElements und deren Verhalten kapseln, wodurch Redundanz reduziert und die Lesbarkeit und Skalierbarkeit verbessert werden. Selenium Testskripte.

  • Kernkonzept: Jede Anwendungsseite entspricht einer eigenen Seitenklasse, die sowohl die WebElements als auch die darauf ausgeführten Aktionen enthält und so eine klare Trennung zwischen UI-Struktur und Testlogik ermöglicht.
  • Schwerpunkt der Umsetzung: POM fördert die wiederverwendbare und zentralisierte Elementverwaltung – Änderungen an Seitenelementen erfordern Aktualisierungen nur in einer Klasse anstatt in mehreren Skripten.
  • Designvorteil: Das Modell gewährleistet sauberere, modulare und werkzeugunabhängige Objekt-Repositories, die sich in Frameworks wie … integrieren lassen. TestNG, JUnit, Cucumberoder JBehave.
  • Namenskonvention: Methoden innerhalb von Seitenklassen müssen tatsächliche UI-Aktionen widerspiegeln (z. B. gotoHomePage()), wodurch die semantische Klarheit in Automatisierungs-Workflows gestärkt wird.
  • Verbesserte Struktur: Page Factory verfeinert POM durch die Verwendung von @FindBy Anmerkungen und PageFactory.initElements() zur automatischen Initialisierung von WebElements, wodurch sich wiederholende findElement Anrufe.
  • Leistungsoptimierung: AjaxElementLocatorFactory führt Lazy Loading ein – Elemente werden erst geladen, wenn darauf zugegriffen wird – was die Ausführungseffizienz verbessert und ein reibungsloses Verhalten dynamischer Seiten ermöglicht.
  • Ergebnis: Der einheitliche Ansatz führt zu einer wartbaren, lesbaren und skalierbaren Testautomatisierungsarchitektur, die mit modernen Standards übereinstimmt. Selenium Praktiken.

Seitenobjektmodell

Was ist das Page Object Model? Was sind seine wichtigsten Komponenten?

Seitenobjektmodell (POM) Das Designmuster, das häufig in der Testautomatisierung eingesetzt wird, erstellt ein Objekt-Repository für Web-UI-Elemente. Der Vorteil dieses Modells liegt in der Reduzierung von Code-Duplizierung und der verbesserten Testwartung.

In diesem Modell sollte für jede Webseite der Anwendung eine entsprechende Seitenklasse existieren. Diese Seitenklasse identifiziert die WebElements der Webseite und enthält Methoden, die Operationen auf diesen WebElements ausführen. Die Namen dieser Methoden sollten ihrer jeweiligen Aufgabe entsprechen. Wartet beispielsweise ein Ladeindikator auf das Erscheinen des Zahlungsportals, könnte die POM-Methode den Namen `waitForPaymentScreenDisplay()` tragen.

Wichtige Komponenten des Seitenobjektmodells

  • Seitenklassen: Jede Webseite sollte als separate Klasse dargestellt werden.
  • Standorte: Identifizieren Sie Web-Elemente mithilfe von IDs, XPath-Ausdrücken oder CSS-Selektoren.
  • Methoden: Enthalten Aktionen oder Operationen, die an den .page-Elementen durchgeführt werden.
  • Wiederverwendbarkeit: PromoWiederverwendung von Testcode und einfachere Wartung über alle Tests hinweg.
  • Trennung von Bedenken: Hält die Seitenstruktur unabhängig von der Testlogik, um eine bessere Organisation zu gewährleisten.

Seitenobjektmodell

Warum Seitenobjektmodell?

Starten einer UI-Automatisierung in Selenium WebTreiber ist keine schwierige Aufgabe. Man muss lediglich die Elemente finden und die entsprechenden Operationen durchführen.

Betrachten Sie dieses einfache Skript zum Einloggen auf einer Website.

Seitenobjektmodell

Wie Sie sehen können, ist alles, was wir tun, Elemente zu finden und Werte für diese Elemente einzugeben.

Dieses Skript ist zeitaufwendig und fehleranfällig. Anfangs erscheint es einfach, doch mit zunehmender Größe der Testsuite wird die Verwaltung von Elementänderungen schwierig. Die Testsuite wächst mit der Zeit, und je mehr Codezeilen Sie hinzufügen, desto komplizierter wird es.

Das Hauptproblem bei der Skriptpflege besteht darin, dass Sie bei jeder Änderung an diesem Element alle zehn Skripte ändern müssen, wenn zehn verschiedene Skripte dasselbe Seitenelement verwenden. Dies ist zeitaufwändig und fehleranfällig.

Ein besserer Ansatz für die Skriptwartung ist die Erstellung einer separaten Klassendatei, die Webelemente findet, befüllt oder überprüft. Diese Klasse kann dann in mehreren Testskripten wiederverwendet werden, die mit demselben Element interagieren. Sollte sich in Zukunft ein Webelement ändern, muss die Änderung nur in einer einzigen Klassendatei und nicht in zehn verschiedenen Skripten vorgenommen werden.

Dieser Ansatz wird in „Page Object Model“ genannt SeleniumEs trägt dazu bei, den Code lesbarer, wartbarer und wiederverwendbarer zu machen.

 Seitenobjektmodell

👉 Kostenlos anmelden für Live Selenium Projekt

Vorteile von POM

  1. Das Page Object Design Pattern besagt, dass Vorgänge und Abläufe in der Benutzeroberfläche von der Überprüfung getrennt werden sollten. Dieses Konzept macht unseren Code übersichtlicher und leichter verständlich.
  2. Der zweite Vorteil besteht darin, dass das Objekt-Repository unabhängig von Testfällen ist, sodass wir dasselbe Objekt-Repository für verschiedene Zwecke mit unterschiedlichen Tools verwenden können. Beispielsweise können wir das Page Object Model integrieren in Selenium mit elektrostatisch ableitenden TestNG/JUnit für funktionell Tests und gleichzeitig mit JBehave/Cucumber zur Abnahmeprüfung.
  3. Der Code wird kürzer und optimierter, da Seitenmethoden in den POM-Klassen wiederverwendet werden.
  4. Methoden erhalten realistischere Namen, die sich leicht der jeweiligen Operation in der Benutzeroberfläche zuordnen lassen. Wenn wir beispielsweise nach dem Klicken auf die Schaltfläche auf die Startseite gelangen, lautet der Methodenname „gotoHomePage()“.

Wie man POM implementiert Selenium?

Simple PLog in der grundlegenden Struktur eines Page Object Model-Frameworks, wobei die whereManagereIDElements der AUT Die Methoden, die auf diese Webelemente angewendet werden, werden in einer Logdatei verwaltet. Aufgaben wie die Verifizierung sollten als separate Testmethoden behandelt werden.

Implementieren Sie POM

Vollständiges Beispiel

Testfall: Gehen Sie zur Guru99-Demoseite.

Schritt 1) ​​Gehen Sie zur Guru99-Demoseite

Implementieren Sie POM

Schritt 2) Überprüfen Sie auf der Startseite, ob der Text „Guru99 Bank“ angezeigt wird.

Implementieren Sie POM

Schritt 3) Melden Sie sich bei der Anwendung an

Implementieren Sie POM

Schritt 4) Stellen Sie sicher, dass die Startseite den Text „Manager-ID: Demo“ enthält.

Implementieren Sie POM

In diesem Beispiel geht es um zwei Seiten:

  1. Login-Seite
  2. Startseite (wird angezeigt, sobald Sie sich angemeldet haben)

Dementsprechend erstellen wir 2 POM in Selenium Unterricht

Guru99 Anmeldeseite 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 Startseite 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 Einfaches POM in Selenium Testfall

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

Was ist Page Factory? Selenium?

Seite Fabrik in Selenium ist ein integriertes Page Object Model-Framework-Konzept für Selenium Ein WebDriver, der die Wartbarkeit durch die Reduzierung wiederholter Elementzugriffe mithilfe von Annotationen verbessert, nicht durch eine höhere Ausführungsgeschwindigkeit. Er dient zur Initialisierung von Page-Objekten oder zur Instanziierung des Page-Objekts selbst. Außerdem ermöglicht er die Initialisierung von Page-Klassenelementen ohne Verwendung von „FindElement/s“.

Auch hier verfolgen wir das Konzept der Trennung von Page Object Repository und Test Methods. Zusätzlich mit Hilfe der Klasse PageFactory in Selenium, wir verwenden Anmerkungen @FindBy Um WebElement zu finden, verwenden wir die Methode initElements, um WebElemente zu initialisieren.

Seite Factory In Selenium

@FindBy kann akzeptieren tagName, partiellerLinkText, Name, linkText, id, css, className, xpath als Attribute.

Schauen wir uns das gleiche Beispiel wie oben mit Page Factory an

Guru99-Anmeldeseite mit 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-Homepage mit 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 mit Page Factory-Konzept

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

Die vollständige Projektstruktur sieht wie im Diagramm aus:

Seite Fabrik in Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory ist ein Lazy-Loading-Konzept von PageFactory in SeleniumEs dient dazu, Webelemente nur dann zu finden, wenn diese in einer Operation verwendet werden. Es weist der Objektklasse „PageFactory“ ein Timeout für WebElements zu. Einer der Hauptvorteile der Verwendung des PageFactory-Musters ist … Selenium ist die AjaxElementLocatorFactory-Klasse.

Wird hier eine Operation an einem Element durchgeführt, beginnt das Warten auf dessen Sichtbarkeit erst ab diesem Zeitpunkt. Wird das Element innerhalb des vorgegebenen Zeitintervalls nicht gefunden, Testfall Bei der Ausführung wird die Ausnahme „NoSuchElementException“ ausgelöst.

AjaxElement Locator Factory

Beispielsweise:

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

Laden Sie Selenium Projektdateien für die Demo in diesem Tutorial

FAQs

Das Page Object Model (POM) ist ein Entwurfsmuster, das Webseitenelemente in separate Klassen abstrahiert. Es vereinfacht die Automatisierung, indem es UI-Interaktionen von der Testlogik trennt und so für mehr Klarheit, Skalierbarkeit und weniger Code-Duplizierung sorgt.

In SeleniumDie POM-Datei stellt jede Webseite als eigene Klasse dar, die Selektoren und Aktionen enthält. Sie kapselt UI-Elemente und ermöglicht so, dass Testskripte unabhängig von Änderungen der zugrundeliegenden Seitenstruktur bleiben.

POM ist kein eigenständiges Framework, sondern ein Entwurfsmuster. Es lässt sich in jedes Automatisierungs-Framework integrieren, um Tests effizient zu strukturieren und so eine bessere Organisation, Wiederverwendbarkeit und Wartbarkeit zu gewährleisten.

POM ist ein Designprinzip, bei dem jede Webseite als Klasse mit definierten Selektoren und Methoden modelliert wird. Es entkoppelt die Testlogik von den UI-Elementen und verbessert so Lesbarkeit, Skalierbarkeit und langfristige Wartbarkeit.

POM definiert die Entwurfsstruktur für die Seitenabstraktion, während Page Factory Annotationen und Methoden bereitstellt (@FindByPage Factory dient der effizienten Initialisierung von Webelementen und ist eine Implementierungserweiterung von POM.

POM zentralisiert Element-Locators und Seitenaktionen in dedizierten Klassen. Jede UI-Änderung erfordert Aktualisierungen nur an einer Stelle, wodurch Nacharbeiten minimiert, die Code-Wiederverwendung verbessert und die Testwartung beschleunigt wird.

Ja. KI-gesteuerte Testgeneratoren können POM-Klassen automatisch erstellen, indem sie UI-Hierarchien analysieren und dabei die logische Trennung der Belange beibehalten, während gleichzeitig die Erstellung von End-to-End-Tests beschleunigt wird.

POM fördert modulare und wiederverwendbare Testkomponenten und ermöglicht so die Integration mit KI-basierten Testwartungstools, die Locators automatisch aktualisieren, wodurch die Anfälligkeit der Skripte und der Wartungsaufwand reduziert werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: