Page Object Pattern using PageFactory Selenium

Chào các bạn, ở bài viết trước chúng ta đã tìm hiểu về POM(Page object Model).
Bài viết này cũng sẽ dùng kiểu mô hình POM, nhưng sẽ khác 1 chút vì chúng ta dùng PageFactory
Dùng PageFactory  thì chúng ta sẽ không cần phải sử dụng FindElement nữa -> đỡ tốn công gõ code hơn :D
Kịch bản vẫn như ở bàn trước, nhưng lần này chúng ta sẽ chia thành 3 class như sau:

Trong đó: 
  • Class HomePage: chứa các phần tử trong trang, cũng như chứa các phương thức thao tác với các phần tử đó. Ví dụ: click vào button, hay nhập text cho textbox..
  • ClassLoginL: cũng chứa các phần tử trên trang login, các phương thức tương ứng các phần tử như nhập userName, nhập Pass, click btnLogin...
  • Class test: bắt đầu viết testcase
Sau đây là code của chương trình:

Class LoginPage 


package hai.main;



import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.CacheLookup;

import org.openqa.selenium.support.FindBy;

import org.openqa.selenium.support.PageFactory;



public class LoginPage {

 WebDriver driver;



 public LoginPage(WebDriver driver) {

  this.driver = driver;

  PageFactory.initElements(driver, this);

 }


 @FindBy(name = "uid")

 @CacheLookup

 private WebElement userName;



 @FindBy(name = "password")

 @CacheLookup

 private WebElement passWord;



 @FindBy(name = "btnLogin")

 @CacheLookup

 private WebElement btnLogin;



 @FindBy(name = "btnReset")

 @CacheLookup

 private WebElement reSetPass;


 public LoginPage setUserName(String name) {

  userName.sendKeys(name);

  return this;

 }

 public LoginPage setpassWord(String pass) {

  passWord.sendKeys(pass);

  return this;

 }

 public LoginPage clickLogin() {

  btnLogin.click();

  return this;

 }

}

Tiếp theo là Class HomePage 


package hai.main;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.support.CacheLookup;

import org.openqa.selenium.support.FindBy;

import org.openqa.selenium.support.PageFactory;


public class HomePage {

 private WebDriver driver;

 @FindBy(className = "heading3")

 @CacheLookup

 private WebElement txtwellCome;

 public HomePage(WebDriver driver) {

  this.driver = driver;

  PageFactory.initElements(driver, this);

 }

 public boolean isLoadPage() {

  return txtwellCome.getText().toString().contains("Welcome To Manager's Page of Guru99 Bank");

 }

}


Sau cùng là class test
package hai.test;


import static org.testng.Assert.*;


import static org.testng.AssertJUnit.assertTrue;


import hai.main.*;



import java.util.concurrent.TimeUnit;


import org.openqa.selenium.WebDriver;


import org.openqa.selenium.chrome.ChromeDriver;


import org.testng.annotations.*;



class testPOM {



 private WebDriver driver;


 private String url = "http://demo.guru99.com/v4/";


 private LoginPage loginPage;


 private HomePage homePage;



 @BeforeTest


 void setUp() throws Exception {


  driver = new ChromeDriver();


  driver.get(url);


  loginPage = new LoginPage(driver);


  homePage = new HomePage(driver);


 }


 @AfterTest


 void tearDown() throws Exception {


  driver.quit();


 }


 @Test


 void testLogin() {


  loginPage.setUserName("mngr107562").setpassWord("UbebezU").clickLogin();


  driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);


  assertTrue(homePage.isLoadPage());



 }


}
Chú ý:
  • Cần phải sử dụng dòng code này trong contructor của class: PageFactory.initElements(driver, this);
  • Tại sao lại khởi tạo đối tượng trong @BeforeTest? tại vì khi chạy code thì đầu tiên nó sẽ chạy trong @BeforeTest trước, nên khởi tạo đối tượng luôn ở đó, thì ở các @Test khác thì không cần phải khởi tạo nữa. có thể dùng được trong các @Test khác nhau trong 1 class đó
  • Tại sao lại dùng @CacheLookup? vì sử dụng nó, nếu mà cần lần thứ 2, nó sẽ không phải tìm nữa, dùng như vậy sẽ tiết kiệm được thời gian mà tìm element, giúp tiết kiệm thời gian khi chạy code của project
Vậy là qua bài viết Page Object Pattern using PageFactory, chúng ta đã hiểu về cách sử dụng PageFactory, cũng như lợi thế của nó so với Page Object Pattern. Hẹn gặp lại các bạn ở bài sau :)

0 comments:

Post a Comment