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ề OpReddy đang làm hổm rài. Từ trang SignIn, 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 "signIn" 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 hôm trước bên Test Case khi SignIn xong và vào Dashboard mở Doucment Management:

@Test(priority = 1)
	public void signIn() throws Exception {
		System.out.println(driver);
		signInPage = new SignInPage(driver);

		Assert.assertTrue(signInPage.verifySignInPageTitle(), "Sign In page title doesn't match");
		Assert.assertTrue(signInPage.verifySignInPageText(), "Header page text not matching");
		
		signInPage.signin("thaian@mailinator.com", "Demo@123", "123456");

	}

	@Test(priority = 2)
	public void openDocument() throws Exception {
		
		dashboardPage = new DashboardPage(driver);
		
		Assert.assertTrue(dashboardPage.verifySignInPageTitle(), "Dashboard page title doesn't match");
		dashboardPage.openDocumentManagement();
		
	}

Có vấn đề chưa hay ở chổ: Từ bước signIn sang bước mở Document 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 signInpage 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.

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ổ SignInDashboard thì chúng ta thấy là khi thực hiện hàm signin 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 signIn trong SignInPage class chút.

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

public void signin(String username, String password, String Pin) throws Exception {
    enterEmail(username);
    enterPassword(password);
    clickSignIn();
    Thread.sleep(1000);
    enterPin(Pin);
    clickSubmit();
}

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 signin(String username, String password, String Pin) throws Exception {
    enterEmail(username);
    enterPassword(password);
    clickSignIn();
    Thread.sleep(1000);
    enterPin(Pin);
    clickSubmit();

    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 case ta sẽ chỉnh như sau:

@Test(priority = 1)
public void signIn() throws Exception {
    System.out.println(driver);
    signInPage = new SignInPage(driver);

    Assert.assertTrue(signInPage.verifySignInPageTitle(), "Sign In page title doesn't match");
    Assert.assertTrue(signInPage.verifySignInPageText(), "Header page text not matching");

    //Chổ này gán hàm signin cho đối tượng dashboardPage luôn vì hàm signin trả về là 1 khởi tạo trang DashboardPage
    //Và đã có mang driver đi cùng rồi
    dashboardPage = signInPage.signin("thaian@mailinator.com", "Demo@123", "123456");
}

@Test(priority = 2)
public void openDocument() throws Exception {
    //Bên dưới này không cần khởi tạo đối tượng dashboardPage nữa
    Assert.assertTrue(dashboardPage.verifySignInPageTitle(), "Dashboard page title doesn't match");
    dashboardPage.openDocumentManagement();
}

Quá rõ ràng và 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.

Lúc này bạn thử mở lại class BaseSetup chổ hàm initChromeDriver sẽ hiểu nó trả về đối tượng WebDriver có ý nghĩa gì.

Giờ thử viết tiếp từ trang Dashboard sang trang Document Management nào =))


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

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

  • Anh Tester

    Đườ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ẻ kiến thức lên trang

Bạn có thể đăng bài để chia sẻ kiến thức, bài viết của chính bạn lên trang Anh Tester Blog

Danh sách bài học