Seite Objektmodell & Fabrik 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 Seitenklasse identifiziert die Webelemente dieser Webseite und enthält auch Seitenmethoden, die Vorgänge an diesen Webelementen ausführen. Der Name dieser Methoden sollte entsprechend der von ihnen ausgeführten Aufgabe vergeben werden. Wenn also ein Loader auf das Erscheinen des Zahlungsgateways wartet, kann der Name der POM-Methode „waitForPaymentScreenDisplay()“ lauten.

Seitenobjektmodell

Warum Seitenobjektmodell?

Starten einer UI-Automatisierung in Selenium WebDriver ist KEINE schwierige Aufgabe. Sie müssen nur Elemente finden und Operationen daran durchfü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 „Page Object Model“ genannt Selenium. Dadurch wird der Code lesbarer, wartbarer und wiederverwendbarer.

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 ü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 unterschiedliche Zwecke mit unterschiedlichen Tools verwenden können. Beispielsweise können wir das Page Object Model integrieren Selenium mit TestNG/JUnit für funktionell Testen und gleichzeitig mit JBehave/Cucumber zur Abnahmeprüfung.
  3. Der Code wird aufgrund der wiederverwendbaren Seitenmethoden in den POM-Klassen kleiner und optimiert.
  4. Methoden erhalten realistischere Namen, die sich leichter den in der Benutzeroberfläche stattfindenden Vorgängen zuordnen lassen. Wenn wir beispielsweise nach dem Klicken auf die Schaltfläche auf der Startseite landen, lautet der Methodenname beispielsweise „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 auf diese Webelemente zugreift, wird in einer Klassendatei verwaltet. Eine Aufgabe wie die Überprüfung sollte als Teil der Testmethoden separat durchgeführt 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“ 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 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 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 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("manger id : mgr123"));

    }

Was ist Page Factory? Selenium?

Seite Fabrik in Selenium ist ein integriertes Page Object Model-Framework-Konzept für Selenium WebDriver, aber es ist sehr optimiert. 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. Zusätzlich mit Hilfe der Klasse PageFactory in Selenium, wir verwenden Anmerkungen @FindBy um WebElement zu finden. Wir verwenden die initElements-Methode, 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("manger 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 Selenium. Es wird verwendet, um die Webelemente nur zu finden, wenn die Elemente in einer Operation verwendet werden. Es weist der Objektseitenklasse ein Timeout für WebElements zu. Einer der Hauptvorteile der Verwendung des Musters PageFactory in Selenium ist die AjaxElementLocatorFactory-Klasse.

Wenn hier eine Operation an einem Element durchgeführt wird, beginnt die Wartezeit 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. Seitenobjektmodell in Selenium WebDriver ist ein Objekt-Repository-Entwurfsmuster.
  2. Selenium Das 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 – einem Seitenobjekt-Entwurfsmuster, um WebElements nur dann zu identifizieren, wenn sie in einem Vorgang verwendet werden.

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

Mehr lesen Weiterlesen