Tech

Mô hình đối tượng POM và Page Factory trong Selenium WebDriver

POM là gì?

POM (POM) là một mẫu thiết kế, được sử dụng phổ biến trong tự động thử nghiệm để tạo Object Repository đối tượng cho các phần tử giao diện người dùng web. Ưu điểm của mô hình là giảm sự trùng lặp mã và cải thiện khả năng bảo trì thử nghiệm.

Theo mô hình này, đối với mỗi trang web trong ứng dụng, cần có một Page Class tương ứng. Page Class này sẽ xác định các WebElements của trang web đó và cũng chứa các method của Trang thực hiện các hoạt động trên các WebElements đó. Tên của các method này phải được cung cấp theo tác vụ mà chúng đang thực hiện, tức là, nếu một trình nạp đang đợi cổng thanh toán xuất hiện, thì tên method POM có thể là waitForPaymentScreenDisplay ().

Tại sao lại là POM?

Bắt đầu tự động giao diện người dùng trong Selenium WebDriver KHÔNG phải là một nhiệm vụ khó khăn. Bạn chỉ cần tìm các phần tử, thực hiện các thao tác trên đó.

Hãy xem xét tập lệnh đơn giản này để đăng nhập vào một trang web

Như bạn có thể quan sát, tất cả những gì chúng tôi đang làm là tìm các phần tử và điền giá trị cho các phần tử đó.

Đây là một kịch bản nhỏ. Bảo trì tập lệnh trông dễ dàng. Nhưng với thời gian bộ thử nghiệm sẽ phát triển. Khi bạn thêm ngày càng nhiều dòng vào mã của mình, mọi thứ trở nên khó khăn.

Vấn đề chính đối với việc bảo trì tập lệnh là nếu 10 tập lệnh khác nhau đang sử dụng cùng một page element, với bất kỳ thay đổi nào trong phần tử đó, bạn cần phải thay đổi tất cả 10 tập lệnh. Việc này tốn thời gian và dễ xảy ra lỗi.

Một cách tiếp cận tốt hơn để bảo trì tập lệnh là tạo một tệp Class riêng biệt sẽ tìm thấy các phần tử web, điền chúng hoặc xác minh chúng. Class này có thể được sử dụng lại trong tất cả các script sử dụng phần tử đó. Trong tương lai, nếu có thay đổi trong phần tử web, chúng ta cần thực hiện thay đổi chỉ trong 1 tệp Class chứ không phải 10 tập lệnh khác nhau.

Cách tiếp cận này được gọi là POM trong Selenium. Nó giúp làm cho mã dễ đọc hơn, dễ bảo trì và có thể tái sử dụng.

Ưu điểm của POM

  1. Mẫu thiết kế đối tượng trang cho biết các hoạt động và luồng trong giao diện người dùng nên được tách biệt khỏi xác minh. Khái niệm này làm cho mã của chúng tôi sạch hơn và dễ hiểu.
  2. Lợi ích thứ hai là Object Repository đối tượng độc lập với các trường hợp thử nghiệm, vì vậy chúng ta có thể sử dụng cùng một Object Repository đối tượng cho một mục đích khác với các công cụ khác nhau. Ví dụ: chúng ta có thể tích hợp POM trong Selenium với TestNG / JUnit để kiểm tra chức năng và đồng thời với JBehave / Cucumber để kiểm tra chấp nhận.
  3. Mã trở nên ít hơn và được tối ưu hóa do các method trang có thể sử dụng lại trong các Class POM.
  4. Các method có tên thực tế hơn, có thể dễ dàng ánh xạ với hoạt động diễn ra trong giao diện người dùng. tức là nếu sau khi nhấp vào nút chúng ta đến trang chủ, tên method sẽ giống như ‘gotoHomePage ()’.

Làm thế nào để thực hiện POM?

POM đơn giản:

Đó là cấu trúc cơ bản của khuôn khổ POM, trong đó tất cả các Phần tử Web của AUT và method hoạt động trên các Phần tử Web này được duy trì bên trong một tệp Class. Một tác vụ như xác minh nên tách biệt như một phần của Phương pháp kiểm tra.

Hoàn thành ví dụ

TestCase: Truy cập Trang web Demo Guru99.

Bước 1) Truy cập Trang web Demo Guru99Mô hình đối tượng trang (POM) & Nhà máy trang trong Selenium: Hướng dẫn hoàn chỉnh
Bước 2) Trong trang chủ kiểm tra văn bản “Guru99 bank” là hiện tạiMô hình đối tượng trang (POM) & Nhà máy trang trong Selenium: Hướng dẫn hoàn chỉnh
Bước 3) Đăng nhập vào ứng dụngMô hình đối tượng trang (POM) & Nhà máy trang trong Selenium: Hướng dẫn hoàn chỉnh
Bước 4) Xác minh rằng Trang chủ có chứa văn bản là “Id người quản lý: demo”Mô hình đối tượng trang (POM) & Nhà máy trang trong Selenium: Hướng dẫn hoàn chỉnh

Đây là chúng tôi đang xử lý 2 trang

  1. Trang đăng nhập
  2. Trang chủ (hiển thị sau khi bạn đăng nhập)

Theo đó, chúng tôi tạo 2 POM trong các Class Selenium

Guru99 Trang đăng nhập 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 Trang chủ POM trong 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 Simple POM trong Selenium Test case

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

    }

Page Factory trong Selenium là gì?

Page Factory trong Selenium là một khái niệm khung POM có sẵn cho Selenium WebDriver nhưng nó được tối ưu hóa rất tốt. Nó được sử dụng để khởi tạo các đối tượng Trang hoặc để khởi tạo chính đối tượng Trang. Nó cũng được sử dụng để khởi tạo các phần tử Page Class mà không cần sử dụng “FindElement / s.”

Ở đây, chúng tôi cũng tuân theo khái niệm tách biệt của Object Repository đối tượng trang và Phương pháp kiểm tra. Ngoài ra, với sự trợ giúp của Class PageFactory trong Selenium, chúng tôi sử dụng chú thích @FindBy để tìm WebElement. Chúng tôi sử dụng method initElements để khởi tạo các phần tử web

@FindBy có thể chấp nhận tagName, partLinkText, tên, linkText, id, css, className, xpath làm thuộc tính.

Hãy xem ví dụ tương tự như trên bằng cách sử dụng Page Factory

Trang đăng nhập Guru99 với 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 Home Page với 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 với Page Factory concept

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

    }

}

Cấu trúc dự án hoàn chỉnh sẽ giống như sơ đồ:

AjaxElementLocatorFactory

AjaxElementLocatorFactory là một khái niệm tải chậm của PageFactory trong Selenium. Nó được sử dụng để tìm các phần tử web chỉ khi các phần tử được sử dụng trong bất kỳ hoạt động nào. Nó chỉ định thời gian chờ cho WebElements cho đối tượng Page Class. Một trong những ưu điểm chính của việc sử dụng mẫu PageFactory trong Selenium là Class AjaxElementLocatorFactory.

Ở đây, khi một thao tác được thực hiện trên một phần tử, việc chờ đợi cho khả năng hiển thị của nó chỉ bắt đầu từ thời điểm đó. Nếu phần tử không được tìm thấy trong khoảng thời gian nhất định, việc thực thi Test Case sẽ ném ra ngoại lệ ‘NoSuchElementException’.

Bản tóm tắt

  1. POM trong Selenium Websdriver là một mẫu thiết kế Object Repository Đối tượng.
  2. POM Selenium tạo mã thử nghiệm của chúng tôi có thể bảo trì, có thể tái sử dụng.
  3. Page Factory là một cách tối ưu hóa để tạo Object Repository đối tượng trong khái niệm khung POM.
  4. AjaxElementLocatorFactory là một khái niệm  lazy load trong Page Factory – mẫu thiết kế đối tượng trang để xác định các WebElements chỉ khi chúng được sử dụng trong bất kỳ hoạt động nào.

Blog Tiền Điện Tử

Blog tiền điện tử công thông tin tổng hợp uy tín nhất tất cả các mảng xã hội, giáo dục , công nghệ số. Với khả năng số hóa mạnh mẽ hy vọng sẽ mang lại cho quý bạn đọc những thông tin chính xác nhất 24/24
Back to top button