XPath cơ bản cho tester: Cách đọc và tự viết locator

⏱︎

Read time:

2–3 minutes
Minh họa XPath: xác định node trong cây HTML

Trong automation test giao diện, trước khi bấm nút, bạn phải xác định đúng phần tử để bấm. XPath là cú pháp truy vấn các node trong HTML/XML.

Lưu ý
Trong Chrome hoặc Firefox, bạn chuột phải vào vùng cần check, bấm Inspect, menu DevTools sẽ hiện ra cho bạn thấy được cấu trúc HTML của trang web đó

Ở bài này, chúng ta sẽ dùng một trang rất nhỏ để hiểu từng phần của biểu thức XPath.

Các thẻ HTML phổ biến

Tên thẻÝ nghĩa
<button>Nút
<div>Phân vùng
<a>Đường link
<input>Textbox
<select>Dropdown
<img>Ảnh
<p>Đoạn văn
<h1> <h2> <h3> <h4>Chữ tiêu đề to, nhỏ…

Nhìn HTML trước khi viết XPath

<form id="login-form">
  <label for="email">Email</label>
  <input id="email" name="email" type="email">
  <button type="submit">Đăng nhập</button>
</form>
<ul class="products">
  <li><span>Bút</span><button>Mua</button></li>
  <li><span>Vở</span><button>Mua</button></li>
</ul>

form, input, button là thẻ (node).

id, name và type là thuộc tính.

Dấu @ trong XPath dùng để chọn thuộc tính.

Ký hiệuÝ nghĩaVí dụ
//Tìm element ở mọi độ sâu//button
/Tìm element dưới 1 nấc//form/button
@Thuộc tính//input[@id="email"]
[...]Điều kiện lọc//button[@type="submit"]

Tìm theo thẻ và thuộc tính

Tìm input có id là 'email':
//input[@id="email"]

Tìm input có name là 'email':
//input[@name="email"]

Tìm button có type là 'submit':
//button[@type="submit"]

Từ form có id là 'login-form', lấy thằng button ngay dưới nó (con của nó):
//form[@id="login-form"]/button

Nếu trang có nhiều button, //button sẽ khớp nhiều phần tử. Hãy thêm điều kiện đủ rõ và ưu tiên thuộc tính ổn định như id hoặc data-testid nếu project cung cấp.

Lưu ý
Bao giờ màn hình Inspector hightlight màu vàng đúng đến element mà bạn cần, và hiển thị Found 1 of 1 thì tức là xpath của bạn đã chuẩn chỉ rồi ✌️

Tìm theo chữ hiển thị

Dùng text() hoặc contains() tuỳ theo nhu cầu của bạn:

Tìm button có text là 'Đăng nhập':
//button[text()="Đăng nhập"]

Tìm button có text chứa chữ 'Vở':
//span[contains(text(), "Vở")]
Lưu ý
contain(text(), "abc") có scope hẹp hơn contains(. , "abc"), vì cái sau còn check cả text trong các thẻ con, cái đầu chỉ check text trong các node trực tiếp

Lấy thẻ con làm mốc, đi lên thẻ cha

//span[text()="Vở"]/parent::li

//span[text()="Vở"]/..

Giải thích: 2 cách bên trên là tương đương với nhau, đều là chọc vào thẻ span có text là “Vở”, sau đó đi lên thằng cha

Lấy các thẻ đồng cấp

  • //span[text()="Bút"]/following-sibling::span

Xpath này lấy span Bút làm gốc, sau đó trỏ vào thẻ đồng cấp ngay sau nó, chính là thẻ span Vở

Index đếm từ 1

  • //ul[@class="products"]/li[1]
  • //ul[@class="products"]/li[2]

Cả hai biểu thức trỏ tới item thứ hai trong HTML mẫu. XPath đếm từ 1.

Cảnh báo
Xpath index bắt đầu từ 1, còn index trong ngôn ngữ lập trình thì bắt đầu từ 0 nhé!
Mẹo nhớ
Xpath tuyệt đối: toàn xược đơn: /html/body/div[3]/main/button
Xpath tương đối: xược kép: //button[@id="abc"]

Luôn ưu tiên Xpath tương đối vì dễ nhìn, gọn gàng, ít bị break nhé 👌