[Bài 20] Tạo liên kết giữa các pages và xây dựng Navigation

Ta phân tích Test Case ta viết ở bài trước:

Ta thấy có 3 vấn đề:

  1. Không có sự liên kết, chuyển nối giữa các pages. Ví dụ: sau khi Login xong thì chuyển sang Dashboard, ta chưa tạo được sự chuyển giao đó trong code. Ta đang làm là khởi tạo Object mới từ đầu.
    // Thực ra thì đây không phải vấn đề, bạn có thể viết theo kiểu trên vẫn đúng nhé, tùy bạn chọn cách viết nào để bạn và team bạn cùng làm việc được
  2. Vẫn còn mắc lỗi sử dụng trực tiếp API selenium mà ta đã nói ở bài 16.
  3. Khi chuyển giữa các pages, thay vì sử dụng Navigation ở bên trái ta lại sử dụng Links để vào trực tiếp, có vẻ không đúng với thao tác của người dùng.

I. Tạo sự liên kết, chuyển tiếp giữa các pages:

Để mô tả rõ ràng thì mình sẽ lấy lại cái Test Case ở LoginTest, trường hợp login thành công.

Tips: Nếu bạn muốn view nhiều Class cùng lúc trên Eclipse như hình thì chỉ cần Click chuột trái và Hold cái Tab của Class, rồi kéo nó sang vị trí mà bạn muốn nó xuất hiện, cho đến khi cái xuất hiện những đường kẻ mờ thì buông chuột ra.

Trước khi sửa, ta thấy cái function Login kia nó đang là login tùy biến với 2 tham số userName và password, nên không phải lúc nào sau khi Login nó cũng về đc trang Homepage. Do đó, ta cần phải viết thêm 1 method loginSuccess nữa, để đảm bảo rằng bất cứ khi nào dùng đến cái method này nó chắc chắn sẽ chuyển sang DashboardPage.

public class LoginPage {

	...

	public DashboardPage loginSuccess() {
		user_login.sendKeys("giang");
		user_pass.sendKeys("123456789");
		submitBtn.click();
		return new DashboardPage(driver);
	}

}

Ở đây, mình sửa lại 1 chút, method này sẽ return 1 Object loại DashboardPage và method này ko có tham số vì mình sẽ input luôn giá trị login đúng vào trong luôn. Dó đó, ở bên Test Case mình cũng sửa lại.

public class LoginTest extends BaseTest {
	LoginPage loginPg;
	DashboardPage dashboardPg;

	@Test
	public void loginByAdmin() {
		loginPg = new LoginPage(driver);
		
		dashboardPg = loginPg.loginSuccess();
		Assert.assertTrue(dashboardPg.isDisplayed());
	}

}

ở bên này, thay vì ta sẽ khởi tạo new 1 Object DashboardPage thì ta sẽ gán luôn cái instance đó là kết quả của việc gọi method loginSuccess().

Bây giờ ta đã thấy có sự chuyển giao giữa LoginPage và DashboardPage. Lưu ý, đây ko phải là chuyển driver từ Page này sang Page khác (một bạn đã hỏi mình) mà chỉ là cách để có sự nối tiếp giữa 2 pages.

Tương tự như thế, ta sẽ làm “cái chuyển nối” ở các method sẽ open 1 page khác. Và điển hình đấy là cái Navigation.

II. Tạo Navigation.

Vì cái Navigation này hầu như Page nào cũng sử dụng nên mình sẽ viết nó vào BasePage như mình đã nói ở bài 10.

Cái BasePage này cũng không khác các Page khác, cũng có các đối tượng WebElement và có cách Method để chuyển sang các Page khác. Lưu ý đến các trường hợp Element đó bị ẩn, ta cần sử dụng Actions như bài 19.

public class BasePage {
	@FindBy(xpath = "//*[@id='menu-dashboard']/a")
	WebElement navDashborad;
	
	@FindBy(xpath = "//*[@id='menu-posts']/a")
	WebElement navPosts;

	@FindBy(xpath = "//*[@id='menu-posts']//a[text()='All Posts']")
	WebElement navAllPosts;
	
	@FindBy(xpath = "//*[@id='menu-posts']//a[text()='Add New']")
	WebElement navAddNew;
	
	WebDriver driver;
	Actions action;
	
	public BasePage(WebDriver driver) {
		this.driver = driver;
		action = new Actions(driver);
		PageFactory.initElements(driver, this);
	}

	
	public DashboardPage moveToDashboradPage() {
		navDashborad.click();
		return new DashboardPage(driver);
	}
	
	public AllPostsPage moveToAllPostsPage() {
		navPosts.click();
		return new AllPostsPage(driver);
	}
	
	public AddNewPostPage moveToAddNewPostPage() {
		action.moveToElement(navPosts).click().perform();
		navAddNew.click();
		return new AddNewPostPage(driver);
	}

}

Sau đó, ta sẽ sửa lại những Class nào có sử dụng Navigation bằng cách Extends class BasePage như cách chúng ta đã làm với BaseTest ở bài 10.

Lưu ý: Vì class BasePage có constructor nên khi các Class khác mà extends từ nó thì sẽ có phải sửa cả constructor của Class đó, bằng cách cho thêm super(driver).

Ví dụ:

public class AllPostsPage extends BasePage{

	...
	
	public AllPostsPage(WebDriver driver) {
		super(driver);
		this.driver = driver;
		PageFactory.initElements(driver, this);
	}

	...
}

Lưu ý: Ta đã khai báo Actions ở class BasePage nên ở class AllPostsPage ta không cần khai báo lại. (đọc lại bài 19 nếu đoạn này không hiểu)

Cuối cùng, ta sửa các class Test Case.

Class AddNewPostTest

public class AddNewPostTest extends BaseTest {
	LoginPage loginPg;
	DashboardPage dashboardPg;
	AddNewPostPage addNewPg;
	PostDetailPage postDetailPg;

	@Test
	public void addNewPost(){
		loginPg = new LoginPage(driver);

		dashboardPg = loginPg.loginSuccess();
		addNewPg = dashboardPg.moveToAddNewPostPage();
		addNewPg.addANewPost(title, body);
		postDetailPg = addNewPg.goToDetailPage();
		
		Assert.assertEquals(postDetailPg.getPostTitle(), title);
	}
}

Class AllPostsTest

public class AllPostsTest extends BaseTest {
	LoginPage loginPg;
	DashboardPage dashBoardPg;
	AddNewPostPage addNewPg;
	AllPostsPage allPostsPg;

	@Test
	public void deleteFirstPost() {
		loginPg = new LoginPage(driver);

		dashBoardPg = loginPg.loginSuccess();
		addNewPg = dashBoardPg.moveToAddNewPostPage();
		addNewPg.addANewPost(title, body);

		allPostsPg = addNewPg.moveToAllPostsPage();
		allPostsPg.deleteFirstRowPost();
		Assert.assertNotEquals(allPostsPg.getTitleFirstPost(), title);
	}
}

Nhìn vào 2 Classes này, ta đã thấy được sự gắn kết, chuyển tiếp giữa các Page hơn, và đồng thời việc di chuyển dựa trên Navigation làm cho ta mô phỏng thao tác của người dùng tốt hơn, và remove luôn những dòng code sử dụng trực tiếp API của selenium.

Ok. Hẹn các bạn vào những bài tiếp theo.

À mà quên, chưa đi được nửa chặng đường đâu nhé. =)))) Automation đâu đơn giản trong 4 cái TestCase với mấy thứ đơn giản này. Chúng ta mới chỉ mô phỏng một chút xíu thao tác của người dùng thôi, còn nhiều thứ lắm. Hãy tiếp tục học tập với mình. 😀

0 0 votes
Article Rating
Subscribe
Notify of
guest
4 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] ← Previous Next → […]

trackback

[…] Trong TH này, để đơn giản mình sẽ sử dụng cách thứ 2 để đơn giản, cách 1 mình sẽ hướng dẫn cách bạn vào 1 bài khác. […]

LOEY
LOEY
6 years ago

Cảm ơn anh rất nhiều, tiếp tục cho ra lò những bài học tiếp theo anh nhé ^^