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.

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.
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.
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.
👉 Kostenlos anmelden für Live Selenium Projekt
Vorteile von POM
- 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.
- 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.
- Der Code wird kürzer und optimierter, da Seitenmethoden in den POM-Klassen wiederverwendet werden.
- 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.
Vollständiges Beispiel
Testfall: Gehen Sie zur Guru99-Demoseite.
Schritt 1) Gehen Sie zur Guru99-Demoseite
Schritt 2) Überprüfen Sie auf der Startseite, ob der Text „Guru99 Bank“ angezeigt wird.
Schritt 3) Melden Sie sich bei der Anwendung an
Schritt 4) Stellen Sie sicher, dass die Startseite den Text „Manager-ID: Demo“ enthält.
In diesem Beispiel geht es um zwei Seiten:
- Login-Seite
- 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.
@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:
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.
Beispielsweise:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Laden Sie Selenium Projektdateien für die Demo in diesem Tutorial











