Showing posts with label page object model. Show all posts
Showing posts with label page object model. Show all posts

Page Object Model In Robot Framework

Chào các bạn, chúng ta lại gặp nhau trong loạt bài về robot framework.
Hôm nay chúng ta sẽ nói về mô hình POM - Page Object Model in robot framework.
Mình tin rằng khi các bạn mới dùng robot framework thì cũng sẽ thắc mắc về cách tổ chức code trong project của robotframework như thế nào?
Đầu tiên chúng ta sẽ chia thành các thư mục như sau:
1. Page: nơi sẽ chứa các page của trang web or mobile app. ví dụ nhưng page login chả hạn
2. Resources: Nơi sẽ chứa các hàm common, hoặc các data test hoặc file cài đặt , ví dụ như apk or app
3. Test: Nơi sẽ chứa toàn bộ test case của dự án, có thể chia nhỏ hơn thành các thư mục con, ví dụ như test_login

Code của 3 file như sau


OK, chúng ta sẽ đi từng file cụ thể như sau:
1. File common_keyword.robot:
File này sẽ chứa toàn bộ các keyword dùng chung, ví dụ như input text , click element...
Trong ví dụ này, cụ thể mình có 03 keyword như dưới đây. Để đảm bảo tetstcase luôn đúng thì mình  chờ cho nó xuất hiện.
Ở đây, chúng ta sẽ khai báo tất cả các thư viện cần sử dụng vào 1 file này, khi cần sửa, xóa thì cứ vào file common_keyword.robot chứ không cần phải đi tìm ở các file khác.

*** Settings ***
Library    SeleniumLibrary

*** Keywords ***
wait and input text
    [Arguments]    ${locator}    ${txt_value}
    Wait Until Element Is Visible     ${locator}
    Input Text    ${locator}    ${txt_value}

wait and click element
    [Arguments]    ${locator}
     Wait Until Element Is Visible     ${locator}
     Click Element    ${locator}


Check Element Visible
    [Arguments]    ${locator}
    ${present}=    Run Keyword And Return Status    Element Should Be Visible       ${locator}    10s
    [Return]    ${present}

2. File loginPage.robot
File này chứa các element của page cần test, và chứa các action liên quan .
Chú ý: các locator của element sẽ được đặt vào biến, để sau này khi locator bị thay đổi, thì chúng ta chỉ cần đổi ở nơi khai báo biến là được.
Trong page, cần import file common để có thể sử dụng tất cả các keywork của file common.
*** Settings ***
Resource    ../Resources/common_keyword.robot

*** Variables ***
${url}    https://www.adayroi.com/
${btn_DangNhap_DangKy}      Class:header-username
${txt_name}    id:j_username
${txt_pass}    id=j_password
${btn_login}    css=.btn.btn-primary.btn-block.js-login-btn

*** Keywords ***
open website Adayroi
    Open Browser    ${url}    chrome

click button DangNhap,DangKy
    wait and click element    ${btn_DangNhap_DangKy}

type username
    [Arguments]    ${txt_value}
    wait and input text    ${txt_name}     ${txt_value}

type password
    [Arguments]    ${txt_value}
    wait and input text    ${txt_pass}     ${txt_value}

click button login
    wait and click element    ${btn_login}
3. File testLogin.robot
file test này chúng ta chỉ cần gọi lại các action tương ứng với các step ở Page cần test.
Chú ý: trong setting cần import file loginpage để có thể dùng các keywork ở page đó.

*** Settings ***
Resource    ../page/loginPage.robot
*** Test Cases ***
test login
    open website Adayroi
    click button DangNhap,DangKy
    type username    hainv
    type password    123456
    click button login

OK, vậy là chúng ta đã hiểu cơ bản cách dùng Page Object Model in robot framework là như thế nào.
Hẹn gặp các bạn ở bài sau!
Các bạn có ý kiến gì hãy để lại comment nhé!

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 :)

Page Object Model selenium



Bài viết này chúng ta sẽ tìm hiểu về cách viết POM cho selenium.
Mục đích của cách viết code kiểu này là để dễ bảo trì, và có thể sử dụng lại nhiều lần.
POM thực chất chỉ là 1 design pattern, không phải là framework.
Chúng ta hãy cùng nhìn qua ví dụ sau:
Ví dụ dưới đây là login vào trang http://demo.guru99.com/v4 với acc:
User ID : mngr99530
Password : dedunab

trước tiên chúng ta sẽ viết 1 class để xử lý với các element,
sau đó se có 1 class thứ 2, chỉ để gọi lại và sử dụng nó.
Đây là class LoginPage:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class LoginPage {
    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    WebDriver driver;
    By name = By.name("uid");
    By pass = By.name("password");
    By btn_login = By.name("btnLogin");

    public void loginDemo(String uid, String password) {
        driver.findElement(name).sendKeys(uid);
        driver.findElement(pass).sendKeys(password);
        driver.findElement(btn_login).click();

    }


}

Nhìn vào class này, chúng ta sẽ thấy nó có nhiệm vụ là tìm 3 element cần thiết, đó là name, pass và btnlogin.
và chúng ta có 1 hàm loginDemo, với 2 biến truyền vào là name và pass.
ở class tiếp theo, chúng ta chỉ việc gọi nó lên và sử dụng với name và pass cần kiểm tra

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class Verify {
    @Test
    public void verifyValidLogin() {
        System.setProperty("webdriver.chrome.driver", "D:\\NVH\\selenium\\gecko\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();

        driver.manage().window().maximize();

        driver.get("http://demo.guru99.com/v4/");

        LoginPage login = new LoginPage(driver);

        login.loginDemo("mngr99530", "dedunab");
        driver.quit();

    }
}

Vậy là chúng ta đã hiểu về mẫu thiết kế POM rồi. POM là mẫu thiết kế hay được sử dụng nhất, còn có 1 loại nữa là page factory, cũng hay được dùng, bài sau chúng ta sẽ tìm hiểu về nó nhé.

Ảnh trong bài là mình dùng IntelliJ IDEA Community Edition 2017.2.5 để viết script minh họa :)