NỘI DUNG BÀI HỌC

Tạo liên kết giữa các Page với cấu trúc Page Object Model trong Selenium Java

✅ Thiết lập quan hệ giữa các trang là gì?

Giả sử bạn có hai trang, Trang A và Trang B. Khi bạn nhấp vào một phần tử web nào đó trên Trang A, nó sẽ điều hướng đến Trang B. Vì vậy, bạn nên tạo phương thức sao cho sau khi nhấp vào phần tử web trên trang A hoặc thao tác gì đó rồi sau đó nó cho bạn quyền kiểm soát trên trang B luôn (khởi tạo đối tượng trang B). Người dùng không cần tạo một đối tượng của trang B riêng sau đó để truy cập các thành viên của Trang B.

Lấy ví dụ về CRM System đang làm hổm rài. Từ trang Login, khi người dùng thực hiện đăng nhập thì nó chuyển hướng đến trang Dashboard. Vậy thì mình sẽ tạo mối quan hệ giữa 2 trang này với hành động đăng nhập bằng cách bạn tạo một phương thức "loginCRM()" và đặt kiểu trả vềđối tượng của trang Dashboard. Nó được gọi là thiết lập mối quan hệ giữa các trang.

✅ Tạo mối liên kết giữa các trang

Các bạn xem lại bài Page Object Model hôm trước chỗ DashboardTest khi loginCRM xong và vào Dashboard:

import com.anhtester.Bai17_PageObjectModel.pages.DashboardPage;
import com.anhtester.Bai17_PageObjectModel.pages.LoginPage;
import com.anhtester.common.BaseTest;
import org.testng.annotations.Test;

public class DashboardTest extends BaseTest {

    LoginPage loginPage;
    DashboardPage dashboardPage;

    @Test(priority = 1)
    public void testCheckDashboardTotal(){
        loginPage = new LoginPage(driver);
        loginPage.loginCRM();

        dashboardPage = new DashboardPage(driver);
        dashboardPage.verifyInvoicesAwaitingPaymentTotal("0 / 2");
    }

}

Có vấn đề chưa hay ở chổ: Từ bước loginCRM sang bước mở trang Dashboard lên để verifyInvoicesAwaitingPaymentTotal chưa thấy sự liên kết cũng như luồng đi liền mạch của nó. Bên trên khởi tạo đối tượng loginPage và bên dưới phải khởi tạo thêm giá trị cho đối tượng dashboardPage một lần nữa. Rõ ràng là nó y như rời rạc nhau, khởi tạo độc lập cho từng trang.

Thực sự thì như vậy vẫn được chả sao cả. Nhưng nhìn nó chưa hay. Kiểu là mình đã dùng POM mà nhìn project như vậy sau nhiều trang sẽ thấy nó rời rạc nhau không đẹp và logic chưa chặt chẽ.


==> Bây giờ mình sửa nó lại để cho nó có sự liên kết


Đầu tiên
chúng ta xác định 1 điều là khi nào có sự chuyển hướng sang trang mới. Nghĩa là sự kết nối trang bắt đầu từ đâu.

Xét ví dụ trên chổ LoginPageDashboardPage thì chúng ta thấy là khi thực hiện hàm lognCRM thành công thì nó chuyển hướng đến trang Dashboard. Vậy thì mình sẽ chỉnh lại hàm loginCRM() trong LoginPage class một chút.

Bình thường thì hàm loginCRM sẽ là:

public void loginCRM(String email, String password) {
    WebUI.openWebsite("https://crm.anhtester.com/admin/authentication");
    WebUI.setText(inputEmail, email);
    WebUI.setText(inputPassword, password);
    WebUI.clickElement(buttonLogin);
    verifyLoginSuccess();
}

Theo như lý thuyết trên thì mình sẽ cho nó trả về là 1 đối tượng của class DashboardPage

public DashboardPage loginCRM(String email, String password) {
    WebUI.openWebsite("https://crm.anhtester.com/admin/authentication");
    WebUI.setText(inputEmail, email);
    WebUI.setText(inputPassword, password);
    WebUI.clickElement(buttonLogin);
    verifyLoginSuccess();

    return new DashboardPage(driver);
}

Chúng ta thấy là nó sẽ trả về (return) là một khởi tạo mới giá trị cho class DashboardPage với driver đi cùng luôn.

Vậy thì sang test cases ta sẽ chỉnh như sau:

import com.anhtester.Bai19_PageNavigation.pages.DashboardPage;
import com.anhtester.Bai19_PageNavigation.pages.LoginPage;
import com.anhtester.common.BaseTest;
import org.testng.annotations.Test;

public class DashboardTest extends BaseTest {

    LoginPage loginPage;
    DashboardPage dashboardPage;

    @Test(priority = 1)
    public void testCheckDashboardTotal(){
        loginPage = new LoginPage(driver);

        //loginPage.loginCRM();

        //dashboardPage = new DashboardPage(driver);

        dashboardPage = loginPage.loginCRM();
        dashboardPage.verifyInvoicesAwaitingPaymentTotal("0 / 2");
    }

}


Dòng code:

dashboardPage = loginPage.loginCRM();

 

Nghĩa là sau khi hàm loginCRM() được thi thi xong thì nó trả về new DashboardPage(driver) nên từ đó nó đã khởi tạo luôn class DashboardPage. Thế là chúng ta chỉ cần lấy đối tượng dashboardPage gán cho sự khởi tạo ấy là nó cũng đã được khởi tạo luôn.

Và nó cho biết một điều là sau khi login thành công xong thì chắc chắn sẽ trỏ tới trang Dashboard chứ không phải trang nào đó khác. Nó sẽ rõ ràng hơn với luồng đi liền mạch nối đuôi nhau.

Các bạn cũng sẽ giảm bớt được các dòng code khởi tạo đối tượng cho trang. Hệ thống nhiều trang thì sẽ thấy nó rõ ràng và gọn hơn nhiều.

Giờ thử viết tiếp từ trang Dashboard sang trang Clients/Customer và Projects thử nào 😁

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học