Seitenobjektmodell (POM) und Seitenfabrik in Selenium

Was ist das Seitenobjektmodell?

Seitenobjektmodell (POM) ist ein Entwurfsmuster, das häufig in der Testautomatisierung verwendet wird und ein Objekt-Repository für Web-UI-Elemente erstellt. Der Vorteil des Modells besteht darin, dass es die Codeduplizierung reduziert und die Testwartung verbessert.

Bei diesem Modell sollte es für jede Webseite in der Anwendung eine entsprechende Seitenklasse geben. Diese Page-Klasse identifiziert die WebElements dieser Webseite und enthält außerdem Page-Methoden, die Operationen an diesen WebElements ausführen. Der Name dieser Methoden sollte entsprechend der von ihnen ausgeführten Aufgabe angegeben werden. Wenn beispielsweise ein Ladeprogramm auf das Erscheinen des Zahlungsgateways wartet, kann der POM-Methodenname „waitForPaymentScreenDisplay()“ lauten.

Seitenobjektmodell

Warum Seitenobjektmodell?

Das Starten einer UI-Automatisierung in Selenium WebDriver ist KEINE schwierige Aufgabe. Sie müssen nur Elemente finden und Operationen daran ausführen.

Betrachten Sie dieses einfache Skript, um sich bei einer Website anzumelden

Seitenobjektmodell

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

Dies ist ein kleines Skript. Die Skriptpflege sieht einfach aus. Aber mit der Zeit wird die Testsuite wachsen. Je mehr Zeilen Sie zu Ihrem Code hinzufügen, desto schwieriger 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 zur Skriptpflege besteht darin, eine separate Klassendatei zu erstellen, die Webelemente findet, füllt oder überprüft. Diese Klasse kann in allen Skripten, die dieses Element verwenden, wiederverwendet werden. Wenn es in Zukunft eine Änderung am Webelement gibt, müssen wir die Änderung in nur einer Klassendatei und nicht in 1 verschiedenen Skripten vornehmen.

Dieser Ansatz wird in Selenium als Page Object Model bezeichnet. Dadurch wird der Code besser lesbar, wartbar und wiederverwendbar.

Seitenobjektmodell

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 sauberer und leicht 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 einen anderen Zweck mit verschiedenen Tools verwenden können. Zum Beispiel können wir das Page Object Model in Selenium mit TestNG/JUnit für die Funktionalität integrieren Testen und gleichzeitig mit JBehave/Cucumber für Akzeptanztests.
  3. Der Code wird aufgrund der wiederverwendbaren Seitenmethoden in den POM-Klassen kleiner und optimiert.
  4. Methoden erhalten realistischere Namen, die leicht mit der in der Benutzeroberfläche ausgeführten Operation zugeordnet werden können. Wenn wir also nach dem Klicken auf die Schaltfläche auf der Startseite landen, lautet der Methodenname etwa „gotoHomePage()“.

Wie implementiert man POM?

Einfaches POM:

Es handelt sich um die Grundstruktur des Seitenobjektmodell-Frameworks, in dem alle Webelemente des AUT und die Methode, die diese Webelemente bearbeitet, werden in einer Klassendatei verwaltet. Eine Aufgabe wie die Überprüfung sollte als Teil der Testmethoden separat sein.

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“ vorhanden ist

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

Hier haben wir es mit 2 Seiten zu tun

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

Dementsprechend erstellen wir 2 POM in Selenium-Klassen

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 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 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 POM in Selen

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 Einfacher 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("http://demo.guru99.com/V4/");

    }

    /**

     * This test case will login in http://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("manger id : mgr123"));

    }

Was ist Page Factory in Selen?

Seitenfabrik in Selen ist ein integriertes Page Object Model-Framework-Konzept für Selenium WebDriver, das jedoch sehr optimiert ist. Es wird zur Initialisierung von Seitenobjekten oder zur Instanziierung des Seitenobjekts selbst verwendet. Es wird auch verwendet, um Seitenklassenelemente zu initialisieren, ohne „FindElement/s“ zu verwenden.

Auch hier verfolgen wir das Konzept der Trennung von Page Object Repository und Test Methods. Darüber hinaus verwenden wir mithilfe der Klasse PageFactory in Selenium Annotationen @FindBy um WebElement zu finden. Wir verwenden die initElements-Methode, um Webelemente zu initialisieren

Seitenfabrik in Selen

@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("http://demo.guru99.com/V4/");

    }

    /**

     * This test go to http://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("manger id : mgr123"));

    }

}

Die vollständige Projektstruktur sieht wie im Diagramm aus:

Seitenfabrik in Selen

AjaxElementLocatorFactory

AjaxElementLocatorFactory ist ein Lazy-Loading-Konzept von PageFactory in Selenium. Es wird nur zum Auffinden der Webelemente verwendet, wenn die Elemente in einem Vorgang verwendet werden. Es weist der Objektseitenklasse ein Timeout für WebElements zu. Einer der Hauptvorteile der Verwendung des Musters PageFactory in Selenium ist die Klasse AjaxElementLocatorFactory.

Wenn hier eine Operation an einem Element ausgeführt wird, beginnt das Warten auf seine Sichtbarkeit erst ab diesem Moment. Wenn das Element im angegebenen Zeitintervall nicht gefunden wird, Testfall Bei der Ausführung wird die Ausnahme „NoSuchElementException“ ausgelöst.

AjaxElement Locator Factory

Zusammenfassung

  1. Das Seitenobjektmodell in Selenium WebDriver ist ein Objekt-Repository-Entwurfsmuster.
  2. Das Selenium-Seitenobjektmodell erstellt unseren Testcode wartbar und wiederverwendbar.
  3. Page Factory ist eine optimierte Methode zum Erstellen eines Objekt-Repositorys im Rahmenkonzept des Page Object Model.
  4. AjaxElementLocatorFactory ist ein Lazy-Load-Konzept in Page Factory – Seitenobjekt-Entwurfsmuster, um WebElements nur dann zu identifizieren, wenn sie in einem Vorgang verwendet werden.

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