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().
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
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.
Keunggulan Badan POM
- Pola Desain Objek Halaman menyatakan operasi dan alur di UI harus dipisahkan dari verifikasi. Konsep ini membuat kode kita lebih bersih dan mudah dipahami.
- 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.
- Kode menjadi lebih sedikit dan optimal karena metode halaman yang dapat digunakan kembali di kelas POM.
- 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.
Contoh Lengkap
Kasus cobaan: Kunjungi Situs Demo Guru99.
Langkah 1) Kunjungi Situs Demo Guru99
Langkah 2) Di halaman beranda, periksa teks “Guru99 Bank” ada
Langkah 3) Masuk ke aplikasi
Langkah 4) Verifikasi bahwa halaman Beranda berisi teks sebagai “Manger Id: demo”
Di sini kita berurusan dengan 2 halaman
- Login
- 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
@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 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'.
Ringkasan
- Model Objek Halaman di Selenium WebDriver adalah pola desain Repositori Objek.
- Selenium model objek halaman membuat kode pengujian kami dapat dipelihara dan digunakan kembali.
- Page Factory adalah cara yang dioptimalkan untuk membuat repositori objek dalam konsep kerangka Model Objek Halaman.
- 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