Trong bài viết trước, mình đã giới thiệu cho các bạn những đặc điểm chung về Playwright và tại sao Playwright ngày càng được phổ biến trong cộng đồng kiểm thử thế giới. Từ bài viết này trở đi, mình và các bạn sẽ tiếp tục tìm hiểu chi tiết về Playwright và những ưu việt mà một framework auto hiện đại có thể làm được. Trước tiên, hãy cùng mình tìm hiểu về định vị phần tử trong Playwrigh trong bài viết hôm nay nhé!
Quy Tắc Cú Pháp Định Vị
Trong Auto Testing bằng Playwright, Locator được sử dụng để tìm và tương tác với các phần tử trên giao diện người dùng (UI). Dưới đây là các cú pháp phổ biến để xác định Locator trong Playwright:
// Định vị qua tag name
page.locator('input')
// Định vị qua id
page.locator(#inputEmail)
// Định vị qua quá trị class
page.locator(.shape-rectangle)
// Định vị bằng thuộc tính
page.locator('[placeholder="Email"]')
// Định vị bằng giá trị class (full)
page.locator('[class="input-full-width size-medium status-basic"])
// Định vị bằng cách kết hợp nhiều loại selector
page.locator('input[placeholder="Email"][nbinput]')
// Định vị bằng XPath (không khuyến khích)
page.locator('//*[@id="inputEmail1"]')
// Định vị bằng khớp một phần văn bản
page.locator(':text{"Auto Test"}')
// Định vị bằng khớp hoàn toàn văn bản
page.locator(':text-is("Auto Test by Playwright)')
User-facing Locator
User-facing Locator trong Playwright là các Locator được thiết kế để mô phỏng cách người dùng tương tác với giao diện ứng dụng. Thay vì dựa vào các chi tiết kỹ thuật như ID, class, hoặc XPath, các Locator này tập trung vào các yếu tố mà người dùng thực sự nhìn thấy và sử dụng, chẳng hạn như văn bản, nhãn, hoặc vai trò của phần tử.
// Định vị dựa trên vai trò phần tử
page.getByRole("textbox", { name: "Email" });
// Định vị bằng nhãn
page.getByLabel("Email")
// Định vị bằng place holder
page.getByPlaceholder("Please enter your email")
// Định vị bằng văn bản
page.getByText("Auto test in Playwright");
// Định vị bằng test id
page.getByTestId("SignIn")
// Định vị bằng tiêu đề
page.getByTitle("IoT Dashboard")
Ưu Tiên User-facing Locator Hơn Là XPath Hoặc CSS
DOM của bạn có thể dễ dàng thay đổi nên việc để các bài kiểm tra của bạn phụ thuộc vào cấu trúc DOM có thể dẫn đến các bài kiểm tra không thành công. Ví dụ, thay vì chọn định vị button dưới đây theo class của nó, thì hãy cân nhắc định vị theo vai trò và tên button.
// 👍 User-facting Locator
page.getByRole('button', { name: 'submit' });
// 👎 Locator by CSS
page.locator('button.buttonIcon.episode-actions-later');
Phần Tử Con
Các locator có thể kết nối lại để thu hẹp phạm vi tìm kiếm vào một phần cụ thể của trang.
// Định vị radio button Option 1
page.locator('nb-card nb-radio :text-is("Option 1")');
//Hoặc
page.locator("bd-card").locator("nb-radio").locator(':text-is("Option 1)');
// Định vị button Si
page.locator("nb-card").getByRole("button", { name: "Sign in" }).first();
//Hoặc
page.locator("nb-card").first().getByRole("button");
Phần Tử Cha
Các locator cũng có thể được định vị dựa trên một phần tử con của nó.
Ví dụ dưới đây thực hiện định vị phần tử cha có tag ‘nb-card’ dựa vào một thành phần con của nó có id là inputEmail
page.locator('nb-card', {has: page.locator('#inputEmail')})
//Hoặc
page.locator('#inputEmail').locator('..')
Sử dụng lại Locator
Một phần tử đã được định vị trên trang, có thể được sử dụng lại để định nghĩa các phần tử khác có cùng cách định vị với nó. Bằng cách này, bạn có thể tránh phải viết code lặp lại nhiều lần, và giúp code trở lên rõ ràng, dễ bảo trì hơn.
Thay vì định vị phần tử như này:
await page
.locator("nb-card", { hasText: "Basic form" })
.getByRole("textbox", { name: "Email" })
.fill("test@test.com");
await page
.locator("nb-card", { hasText: "Basic form" })
.getByRole("textbox", { name: "Password" })
.fill("your password");
await page
.locator("nb-card", { hasText: "Basic form" })
.getByRole("button")
.click();
Hãy viết lại thành:
const basicForm = page.locator("nb-card", { hasText: "Basic form" });
await basicForm.getByRole("textbox", { name: "Email" }).fill("test@test.com");
await basicForm
.getByRole("textbox", { name: "Password" })
.fill("your password");
await basicForm.getByRole("button").click();
Bài viết hôm nay xin tạm dừng ở đây. Cám ơn bạn đã đồng hành cùng mình. Hẹn gặp lại bạn trong bài viết tiếp theo.
Happy testing!

