Model Objek Halaman & Pabrik di Selenium

Apa itu Model Objek Halaman?

Model Objek Halaman (POM) adalah pola desain, yang populer digunakan dalam otomatisasi pengujian yang membuat Repositori Objek untuk elemen UI web. Keuntungan model ini adalah mengurangi duplikasi kode dan meningkatkan pemeliharaan pengujian.

Berdasarkan model ini, untuk setiap halaman web dalam aplikasi, harus ada Kelas Halaman yang sesuai. Kelas Halaman ini akan mengidentifikasi WebElements halaman web tersebut dan juga berisi metode Halaman yang melakukan operasi pada WebElements tersebut. Nama metode ini harus diberikan sesuai tugas yang mereka lakukan, yaitu, jika loader menunggu gateway pembayaran muncul, nama metode POM bisa berupa waitForPaymentScreenDisplay().

Model Objek Halaman

Mengapa Model Objek Halaman?

Memulai Otomatisasi UI di Selenium WebDriver BUKAN tugas yang sulit. Anda hanya perlu menemukan elemen dan melakukan operasi di dalamnya.

Pertimbangkan skrip sederhana ini untuk login ke situs web

Model Objek Halaman

Seperti yang dapat Anda amati, yang kami lakukan hanyalah menemukan elemen dan mengisi nilai untuk elemen tersebut.

Ini adalah skrip kecil. Pemeliharaan skrip terlihat mudah. Namun seiring berjalannya waktu, rangkaian pengujian akan berkembang. Saat Anda menambahkan lebih banyak baris ke kode Anda, segalanya menjadi sulit.

Masalah utama dengan pemeliharaan skrip adalah jika 10 skrip berbeda menggunakan elemen halaman yang sama, dengan perubahan apa pun pada elemen tersebut, Anda perlu mengubah 10 skrip tersebut. Ini memakan waktu dan rawan kesalahan.

Pendekatan yang lebih baik terhadap pemeliharaan skrip adalah dengan membuat file kelas terpisah yang akan menemukan elemen web, mengisinya, atau memverifikasinya. Kelas ini dapat digunakan kembali di semua skrip yang menggunakan elemen tersebut. Kedepannya jika ada perubahan pada elemen web, kita perlu melakukan perubahan pada 1 file kelas saja dan bukan 10 skrip yang berbeda.

Pendekatan ini disebut Model Objek Halaman SeleniumMembantu membuat kode lebih mudah dibaca, dipelihara, dan digunakan kembali.

Model Objek Halaman

Keunggulan Badan POM

  1. Pola Desain Objek Halaman menyatakan operasi dan alur di UI harus dipisahkan dari verifikasi. Konsep ini membuat kode kita lebih bersih dan mudah dipahami.
  2. Manfaat kedua adalah repositori objek tidak bergantung pada kasus uji, sehingga kita dapat menggunakan repositori objek yang sama untuk tujuan berbeda dengan alat berbeda. Misalnya, kita dapat mengintegrasikan Model Objek Halaman ke dalamnya Selenium dengan TestNG/JUnit untuk fungsional pengujian dan pada saat yang sama dengan JBehave/Cucumber untuk pengujian penerimaan.
  3. Kode menjadi lebih sedikit dan optimal karena metode halaman yang dapat digunakan kembali di kelas POM.
  4. Metode mendapatkan nama yang lebih realistis yang dapat dengan mudah dipetakan dengan operasi yang terjadi di UI. yaitu jika setelah mengklik tombol kita mendarat di halaman beranda, nama metodenya akan seperti 'gotoHomePage()'.

Bagaimana cara melaksanakan POM?

POM sederhana:

Ini adalah struktur dasar kerangka model objek Halaman tempat semua Elemen Web AUT dan metode yang beroperasi pada Elemen Web ini dipertahankan di dalam file kelas. Tugas seperti verifikasi harus dipisahkan sebagai bagian dari metode Pengujian.

Melaksanakan Badan POM

Contoh Lengkap

Kasus cobaan: Kunjungi Situs Demo Guru99.

Langkah 1) Kunjungi Situs Demo Guru99

Melaksanakan Badan POM

Langkah 2) Di halaman beranda, periksa teks “Guru99 Bank” ada

Melaksanakan Badan POM

Langkah 3) Masuk ke aplikasi

Melaksanakan Badan POM

Langkah 4) Verifikasi bahwa halaman Beranda berisi teks sebagai “Manger Id: demo”

Melaksanakan Badan POM

Di sini kita berurusan dengan 2 halaman

  1. Login
  2. Halaman Beranda (ditampilkan setelah Anda login)

Oleh karena itu, kami membuat 2 POM di Selenium kelas-kelas

Halaman masuk Guru99 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();        
    }

}

Halaman Beranda Guru99 POM di 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 POM sederhana di Selenium Uji kasus

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"));

    }

Apa yang dimaksud dengan Pabrik Halaman Selenium?

Pabrik Halaman di Selenium adalah konsep kerangka Model Objek Halaman bawaan untuk Selenium WebDriver tetapi sangat dioptimalkan. Ini digunakan untuk inisialisasi objek Halaman atau untuk membuat instance objek Halaman itu sendiri. Ini juga digunakan untuk menginisialisasi elemen kelas Halaman tanpa menggunakan “FindElement/s.”

Di sini juga, kami mengikuti konsep pemisahan Repositori Objek Halaman dan Metode Pengujian. Selain itu, dengan bantuan kelas PageFactory di Selenium, kami menggunakan anotasi @TemukanOleh untuk menemukan WebElement. Kami menggunakan metode initElements untuk menginisialisasi elemen web

Pabrik Halaman Masuk Selenium

@TemukanOleh bisa menerima tagName, parsialLinkText, nama, linkText, id, css, className, xpath sebagai atribut.

Mari kita lihat contoh yang sama seperti di atas menggunakan Page Factory

Halaman Login Guru99 dengan Pabrik Halaman

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();           

    }

}

Halaman Beranda Guru99 dengan Pabrik Halaman

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 dengan konsep Page Factory

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"));

    }

}

Struktur Proyek Lengkap akan terlihat seperti diagram:

Pabrik Halaman di Selenium

Pabrik AjaxElementLocator

Pabrik AjaxElementLocator adalah konsep pemuatan lambat dari PageFactory di Selenium. Digunakan untuk menemukan elemen web hanya ketika elemen tersebut digunakan dalam operasi apa pun. Menetapkan batas waktu untuk WebElements ke kelas halaman objek. Salah satu keuntungan utama menggunakan pola PageFactory di Selenium adalah Kelas AjaxElementLocatorFactory.

Di sini, ketika suatu operasi dilakukan pada suatu elemen, penantian visibilitasnya dimulai dari saat itu saja. Jika unsur tersebut tidak ditemukan dalam selang waktu tertentu, Uji Kasus eksekusi akan memunculkan pengecualian 'NoSuchElementException'.

Pabrik Pencari Lokasi AjaxElement

Ringkasan

  1. Model Objek Halaman di Selenium WebDriver adalah pola desain Repositori Objek.
  2. Selenium model objek halaman membuat kode pengujian kami dapat dipelihara dan digunakan kembali.
  3. Page Factory adalah cara yang dioptimalkan untuk membuat repositori objek dalam konsep kerangka Model Objek Halaman.
  4. AjaxElementLocatorFactory adalah konsep pemuatan lambat di Pabrik Halaman – pola desain objek halaman untuk mengidentifikasi WebElements hanya ketika digunakan dalam operasi apa pun.

Download Selenium File Proyek untuk Demo dalam Tutorial ini