CYBERSOFT
Đăng nhập

Locator & Selector cho người mới: chọn phần tử bền vững (CSS, XPath, data-testid)

Chuyên công nghệNền tảngNgười mớiChuẩn SEO
🗓 1 tháng trước19 phút đọc·👁 1,695 lượt xem👤 406 người đọc

Bài cho người mới: học cách chọn locator selector bền vững qua app TMĐT ShopEasy — id, class, CSS, XPath, text, role, data-testid; vì sao selector giòn dễ vỡ; code Playwright getByRole/getByTestId/XPath chạy được; công cụ inspect; 2 tình huống thật, nhiều mockup, FAQ và trắc nghiệm 5 câu. Chuẩn SEO, dẫn về khóa Tester CyberSoft.

1. Tóm tắt nhanh & phần tử bạn sẽ chọn

⭐ TL;DR — Locator selector là cách xác định phần tử trên giao diện để Playwright thao tác đúng chỗ. Bài này bám màn đăng nhập ShopEasy: bạn học các loại locator (id, class, CSS, XPath, text, role, data-testid), vì sao selector giòn dễ vỡ khi UI đổi, cách viết locator Playwright thật (getByRole/getByTestId/CSS/XPath), và công cụ inspect để tìm phần tử. Có 2 tình huống thực tế, nhiều mockup và trắc nghiệm cuối bài.

Chào bạn mới! Khi mới học automation, bước đầu tiên và quan trọng nhất là dạy công cụ (như Playwright) cách 'tìm' đúng phần tử trên giao diện để thao tác — bước này gọi là chọn locator selector. Chọn sai sẽ khiến test chạy không ổn định: hôm nay chạy được, mai đổi 1 dòng CSS là gãy, dù tính năng thực tế vẫn hoạt động bình thường. Bài này dùng màn hình đăng nhập của app TMĐT ShopEasy làm ví dụ xuyên suốt: bạn sẽ học các loại locator phổ biến (id, class, CSS, XPath, text, role, data-testid), cách chọn loại bền vững nhất, viết locator thật bằng Playwright, và dùng công cụ inspect để tìm phần tử nhanh.

🔒 shopeasy.vn/dang-nhap ShopEasy · TMĐT ShopEasy · Đăng nhập Email mai.tran@gmail.comMật khẩu ••••••••Đăng nhậpQuên mật khẩu? id: #email-input data-testid: password-input role=button, name='Đăng nhập' text: 'Quên mật khẩu?'
Màn hình đăng nhập ShopEasy, chú thích 4 loại locator khác nhau trên các phần tử
📖 Locator: cách xác định một phần tử cụ thể trên giao diện để công cụ automation (như Playwright) biết thao tác đúng lên phần tử đó — có thể dựng từ id, class, CSS, XPath, text, role hay data-testid.

2. Vấn đề: selector giòn khiến test dễ vỡ

Hãy tưởng tượng bạn viết locator cho nút 'Đăng nhập' trên ShopEasy bằng cách mở DevTools, thấy class hiển thị là '.css-a8f3k2', rồi copy nguyên chuỗi đó vào test. Cách này chạy đúng ngay lúc viết, vì tại thời điểm đó class thật sự tồn tại. Vấn đề là nhiều dự án hiện đại dùng công cụ CSS-in-JS hoặc bundler tự sinh tên class ngẫu nhiên mỗi lần build lại — dù bạn không sửa gì về giao diện hay nghiệp vụ.

Kết quả là sau một lần deploy bình thường, class đó đổi thành '.css-x92mtq', và locator cũ không còn tìm thấy phần tử nào nữa. Test báo lỗi đỏ dù tính năng đăng nhập trên thực tế vẫn hoạt động hoàn hảo — đây chính là 'báo động giả' (false alarm), một trong những lý do phổ biến nhất khiến đội ngũ dần mất niềm tin vào bộ test tự động. Bài học cốt lõi: locator giòn không chỉ tốn công sửa, mà còn làm giảm giá trị của cả automation.

📖 Selector giòn: selector dễ vỡ khi giao diện thay đổi dù chỉ một chút, ví dụ dựa vào class tự sinh, vị trí thứ tự phần tử, hay XPath tuyệt đối gắn cứng toàn bộ cây DOM.

3. Locator cơ bản: id, class, CSS selector

id là loại locator cơ bản và thường ổn định nhất trong nhóm locator kiểu cấu trúc, vì theo chuẩn HTML, id phải là DUY NHẤT trên toàn trang — ví dụ '#email-input' trên màn đăng nhập ShopEasy. Nếu đội dev đặt tay và giữ nguyên id này, đây là lựa chọn tốt. class CSS (ví dụ '.btn-primary') cũng dùng được, nhưng kém ổn định hơn vì một class có thể gắn cho nhiều phần tử, và dễ đổi khi đội thiết kế chỉnh style.

CSS selector phức hợp (ví dụ 'div.card > button:nth-child(2)') cho phép tìm phần tử dựa trên cấu trúc lồng nhau, hữu ích khi phần tử không có id/class riêng. Nhưng đây cũng là loại giòn nhất trong nhóm CSS, vì chỉ cần đội FE đổi thứ tự phần tử hay thêm 1 lớp bọc div, toàn bộ đường dẫn CSS có thể sai lệch. Nên xem CSS selector phức hợp là lựa chọn cuối cùng, không phải mặc định.

💡 Ưu tiên id/CSS selector dựa trên thuộc tính CỐ ĐỊNH do đội dev đặt tay (ví dụ #email-input), tránh id/class do công cụ build tự sinh chuỗi ngẫu nhiên.

4. Locator theo text & role (accessibility)

Locator theo text tìm phần tử dựa trên nội dung hiển thị, ví dụ page.getByText('Quên mật khẩu?') trên ShopEasy. Cách này trực quan, dễ đọc, và gần với cách người dùng thật nhìn vào trang. Tuy nhiên, nó có nhược điểm rõ ràng: nếu app hỗ trợ đa ngôn ngữ (vi/en/ja) và bạn chạy test trên bản dịch khác, text sẽ đổi và locator vỡ ngay lập tức.

Locator theo role dựa trên chuẩn accessibility (ARIA) — ví dụ 'button', 'textbox', 'link' — kết hợp với accessible name (tên mà trình đọc màn hình sẽ đọc lên). Cách này vừa bền hơn text thuần (không phụ thuộc CSS/DOM), vừa có lợi ích phụ: buộc bạn phải đảm bảo phần tử có accessibility đúng chuẩn, gián tiếp cải thiện chất lượng UI cho người dùng khuyết tật.

📖 role (accessibility): vai trò của phần tử theo chuẩn ARIA/accessibility (ví dụ button, textbox, link), giúp locator tìm phần tử theo đúng cách người dùng và trình đọc màn hình nhận diện, không phụ thuộc cấu trúc HTML bên dưới.

5. data-testid: locator dành riêng cho test

Trong số mọi loại locator, data-testid thường được xem là lựa chọn BỀN NHẤT cho automation, vì nó là thuộc tính HTML tuỳ chỉnh (ví dụ data-testid='btn-login') do chính đội phát triển chủ động thêm vào CHỈ để phục vụ kiểm thử — không liên quan gì tới style hiển thị hay logic nghiệp vụ. Khi đội FE đổi thư viện CSS, đổi cấu trúc DOM, hay thậm chí dịch lại toàn bộ text sang ngôn ngữ khác, data-testid vẫn giữ nguyên nếu không ai chủ đích xoá nó.

Các loại locator & độ bền khi UI thay đổi Loại locatorVí dụ trên ShopEasyĐộ bềnKhi nào nên dùngid#email-inputKhá bền (nếu id cố định, đặt tay)FE cam kết giữ id ổn địnhclass CSS.btn-primary-a3f9cGiòn (đổi khi CSS-in-JS build lại)Tạm thời, tránh class tự sinhCSS phức hợpdiv.card > button:nth-child(2)Rất giòn (phụ thuộc cấu trúc DOM)Bất đắc dĩ, ưu tiên thay thếXPath tuyệt đối/html/body/div[2]/div[3]/buttonCực giòn (vỡ khi thêm/bớt 1 thẻ)Tránh dùng, gần như không nêntext'Đăng nhập'Trung bình (đổi khi dịch đa ngôn ngữ)Nội dung ít đổi, 1 ngôn ngữrole (accessibility)role=button, name='Đăng nhập'Bền (gắn trải nghiệm người dùng)Ưu tiên phần tử tương tác chuẩn ARIAdata-testiddata-testid='btn-login'Rất bền (chỉ phục vụ test)Ưu tiên hàng đầu khi có sẵnĐộ bền tăng dần khi locator gắn với Ý NGHĨA (role, data-testid) thay vì HÌNH DẠNG hiện tại của trang (class tự sinh, vị trí, XPath tuyệt đối).
Bảng các loại locator phổ biến và độ bền tương ứng khi giao diện ShopEasy thay đổi
📖 data-testid: thuộc tính HTML tuỳ chỉnh do đội phát triển chủ động gắn thêm chỉ để phục vụ automation, không ảnh hưởng style hay logic hiển thị, nên gần như không đổi khi refactor giao diện.
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 25% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!