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.
  • Methods: 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 und TestNG/JUnit fรผr funktionell Tests und gleichzeitig mit JBehave/Cucumber zur Abnahmeprรผfung.
  3. Code wird kleiner und optimierter, da es Seitenmethoden in den POM-Klassen wiederverwendet.
  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: Zurรผck Nach Guru99 Demo-Website.

Schritt 1) Gehen Sie zu Guru99 Demo-Website

Implementieren Sie POM

Schritt 2) รœberprรผfen Sie auf der Startseite, ob der Text โ€žGuruDie โ€ž99 Bankโ€œ ist anwesend

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 Homepage 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 Einfache 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 Startseite 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 Testfรคlle mit dem 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

Hรคufig gestellte Fragen

Das Page Object Model ist ein Entwurfsmuster, das abstracDie Webseitenelemente werden in separate Klassen unterteilt. Dies vereinfacht die Automatisierung, indem UI-Interaktionen von der Testlogik getrennt werden, was die Klarheit, Skalierbarkeit und Code-Duplizierung fรถrdert.

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 Designstruktur fรผr Seitenabs.traction, 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: