Test  Viewpoint
Menu
  • Home
  • Basic Knowledge
  • Manual Testing
  • Test Automation
  • Blog
  • About Me
  • Contact
Menu
Định Vị Phần Tử Trong Playwright

Định Vị Phần Tử Trong Playwright

Posted on May 6, 2025April 20, 2025 by Test Viewpoint

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!

Related

Category: Test Automation

Archives

  • June 2025
  • May 2025
  • April 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023

Categories

  • Basic Knowledge
  • Manual Testing
  • Test Automation

About Me

Xin chào các bạn. Mình là một kỹ sư kiểm thử phần mềm. Ngành công nghệ thông tin nói chung và công việc kiểm thử phần mềm nói riêng luôn luôn đổi mới đòi hỏi phải học hỏi mỗi ngày. Với mình chia sẻ những gì học được là cách tốt nhất để mình học những điều mới. Hãy cùng mình tìm hiểu thông qua blog này nhé!

Newsletter

Nhận thông báo về bài viết mới nhất qua email

Popular Posts

About Me

Xin chào các bạn. Mình là một kỹ sư kiểm thử phần mềm. Ngành công nghệ thông tin nói chung và công việc kiểm thử phần mềm nói riêng luôn luôn đổi mới đòi hỏi phải học hỏi mỗi ngày. Với mình chia sẻ những gì học được là cách tốt nhất để mình học những điều mới. Hãy cùng mình tìm hiểu thông qua blog này nhé!

  • Facebook
  • Instagram
  • YouTube

Recent Posts

Newsletter

Nhận thông báo về bài viết mới nhất qua email

©2025 Test Viewpoint