1. Self-healing locator là gì và giải quyết vấn đề nào
Trong tự động hoá kiểm thử, locator là cách test tìm một phần tử trên giao diện (ví dụ nút 'Đặt hàng'). Nút thắt kinh điển là: mỗi khi lập trình viên đổi UI — đổi id, đổi class, di chuyển phần tử — thì locator cũ không còn tìm thấy, và hàng loạt test đỏ dù chức năng vẫn chạy đúng. Self-healing locator là kỹ thuật AI/heuristic tự đoán một locator thay thế khi locator gốc thất bại, để test tiếp tục chạy thay vì đỏ hàng loạt.
Cách nó hoạt động: khi locator gốc không khớp, hệ thống nhìn các đặc trưng khác của phần tử đã lưu từ lần chạy trước — vai trò (role), nhãn (label), văn bản, thuộc tính lân cận, vị trí tương đối — rồi tìm phần tử giống nhất trên trang hiện tại và gán một điểm tin cậy (confidence score). Nếu tìm được ứng viên đủ giống, nó dùng tạm để test đi tiếp và ghi lại sự kiện 'đã heal'. Nghe rất hấp dẫn, nhưng chính sự 'thông minh' này là con dao hai lưỡi mà bài viết sẽ mổ xẻ.
2. Vì sao tin mù vào self-healing là nguy hiểm
Rủi ro cốt lõi: self-healing có thể 'chữa lành' một thứ đáng lẽ phải đỏ. Hãy tưởng tượng nút 'Xác nhận thanh toán' bị lỗi và biến mất, nhưng gần đó có nút 'Huỷ' hình dạng tương tự. Cơ chế heal thấy locator 'thanh toán' fail, tìm phần tử giống nhất, và có thể chọn nhầm nút 'Huỷ' vì nó ở đúng vị trí. Test 'xanh' — nhưng nó vừa che giấu một bug nghiêm trọng: nút thanh toán đã biến mất khỏi UI. Đây là kịch bản tồi tệ nhất: self-heal biến một lỗi thật thành đèn xanh giả.
Rủi ro thứ hai là 'nợ ẩn': mỗi lần heal thành công mà không ai để ý, locator gốc vẫn sai trong code nhưng test vẫn xanh nhờ heal. Theo thời gian, bộ test tích luỹ hàng loạt locator hỏng được 'vá' bởi heal, và không ai biết test thật sự đang kiểm gì. Đến một ngày heal đoán sai, hoặc nhiều thay đổi chồng lên nhau, cả hệ thống test sụp đổ cùng lúc và không ai hiểu nó từng kiểm gì. Self-heal không log và không buộc sửa gốc sẽ nuôi dưỡng loại nợ này.
3. Nền tảng: locator bền (role/label/test-id)
Cách phòng thủ tốt nhất trước locator giòn không phải là self-heal, mà là chọn locator bền ngay từ đầu. Playwright khuyến nghị một thang ưu tiên: ưu tiên getByRole (theo vai trò và tên có thể đọc, gắn với accessibility), rồi getByLabel/getByPlaceholder (theo nhãn người dùng thấy), rồi getByTestId (thuộc tính data-testid đặt riêng cho test). Tránh CSS class và XPath tuyệt đối vì chúng vỡ ngay khi cấu trúc DOM đổi. Locator càng gần ngữ nghĩa người dùng, càng ít giòn.
// Locator bền vs giòn — chọn đúng thì cần self-heal ít hơn hẳn
// ✅ BỀN: bám ngữ nghĩa, sống sót qua đổi màu/layout
await page.getByRole('button', { name: 'Đặt hàng' }).click();
await page.getByLabel('Số thẻ').fill('4242 4242 4242 4242');
await page.getByTestId('checkout-submit').click();
// ❌ GIÒN: vỡ ngay khi refactor DOM / đổi class utility
await page.locator('div.container > form > button.btn.btn-primary.mt-4').click();
await page.locator('//html/body/div[3]/div[2]/form/button[1]').click();Một điểm hay: getByRole vừa làm test bền, vừa buộc ứng dụng có accessibility tốt (vì test chỉ tìm được nút khi nút có role và tên đúng chuẩn ARIA). Nghĩa là chọn locator bền tạo hiệu ứng tốt kép: test ít giòn hơn và sản phẩm dễ tiếp cận hơn cho người dùng khuyết tật. Khi nền tảng locator đã vững, self-heal chỉ còn là lưới an toàn cho vài trường hợp lẻ, không phải cột chống cho cả bộ test giòn.
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!