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.
- 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.
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 und TestNG/JUnit fรผr funktionell Tests und gleichzeitig mit JBehave/Cucumber zur Abnahmeprรผfung.
- Code wird kleiner und optimierter, da es Seitenmethoden in den POM-Klassen wiederverwendet.
- 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: Zurรผck Nach Guru99 Demo-Website.
Schritt 1) Gehen Sie zu Guru99 Demo-Website
Schritt 2) รberprรผfen Sie auf der Startseite, ob der Text โGuruDie โ99 Bankโ ist anwesend
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 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.
@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:
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












