[{"data":1,"prerenderedAt":20},["ShallowReactive",2],{"blog-post-vi-chon-phan-tu-on-dinh-phoma":3},{"slug":4,"lang":5,"title":6,"summary":7,"date":8,"tags":9,"tag_slugs":15,"thumbnail_url":16,"translations":17,"body":18,"asset_base":19},"chon-phan-tu-on-dinh-phoma","vi","Chọn phần tử ổn định cho tự động hoá giao diện Android bằng Phoma","Hướng dẫn chọn phần tử ổn định trong Phoma để tự động hoá giao diện Android, giảm lỗi khi ứng dụng cập nhật.","2026-11-04",[10,11,12,13,14],"phoma","android","automation","qa","phan-tu",[10,11,12,13,14],"https://blog-api.phomaapp.com/api/blog/posts/chon-phan-tu-on-dinh-phoma/thumbnail.svg?lang=vi",[5],"## Giới thiệu: Tại sao phần tử ổn định quyết định thành công của flow\n\nKhi bạn tự động hoá giao diện Android trên Windows bằng Phoma, bước quan trọng nhất không phải là chọn hành động nhấn hoặc nhập văn bản, mà là chọn phần tử mà flow sẽ tác động lên. Nếu phần tử được chọn không ổn định, flow sẽ chạy được một vài lần rồi bị lỗi ngay khi ứng dụng cập nhật giao diện, đổi màu nút, hay thay đổi thứ tự các mục trong danh sách. Điều này gây ra lỗi giả dương, làm tester và lập trình viên mất thời gian gỡ lỗi thay vì tập trung vào chất lượng sản phẩm.\n\nPhoma đọc cây truy cập tiếp của Android để hiển thị từng thành phần trên màn hình. Mỗi thành phần có một tập hợp thuộc tính như mã định danh, mô tả nội dung, lớp thành phần và chữ hiển thị. Nhóm thuộc tính nào không thay đổi khi ứng dụng được thiết kế lại sẽ giúp flow bền vững hơn. Bài viết này hướng dẫn bạn cách chọn phần tử ổn định trong Phoma, từ cách đọc cây giao diện đến các ví dụ thực tế cho form nhập liệu và danh sách dài.\n\n## Bước 1: Kết nối điện thoại và mở Element Inspector\n\nTrước khi chọn phần tử, bạn cần kết nối điện thoại Android với máy tính chạy Windows.\n\n1. Cài đặt Phoma từ trang web chính thức và khởi động ứng dụng.\n2. Trên điện thoại, vào Cài đặt > Về điện thoại, bấm bảy lần vào Số bản dựng để mở Tù dành cho nhà phát triển.\n3. Vào Tù dành cho nhà phát triển, bật Gỡ lỗi qua USB. Nếu muốn kết nối không dây, bật Gỡ lỗi qua Wi-Fi và cặp kết với máy tính bằng mã cặp hoặc địa chỉ IP.\n4. Mở Phoma, chọn Tạo kết nối mới và chọn USB hoặc Wi-Fi. Chờ Phoma nhận diện thiết bị.\n5. Chọn điện thoại trong danh sách thiết bị, sau đó bấm Kiểm tra phần tử. Phoma sẽ hiển thị cây giao diện hiện tại của ứng dụng đang mở trên điện thoại.\n\nKhi Element Inspector hoạt động, bạn sẽ thấy từng nút trên cây đại diện cho một thành phần giao diện, ví dụ nút bấm, ô nhập liệu, hoặc mục trong danh sách. Mỗi nút kèm theo các thuộc tính mà Phoma lấy từ hệ thống Android.\n\n## Bước 2: Thuộc tính nào nên chọn, thuộc tính nào nên tránh\n\nKhông phải thuộc tính nào cũng phù hợp làm tiêu chí chọn phần tử. Dưới đây là các thuộc tính phổ biến và cách đánh giá độ ổn định.\n\n### resource-id\n\nĐây là thuộc tính ưu tiên nhất. Mã định danh thường có dạng `com.tencongty:id/ten_thanh_phan`. Nó do lập trình viên gán và thường không thay đổi giữa các phiên bản ứng dụng, trừ khi nhóm phát triển thiết kế lại toàn bộ màn hình. Nếu phần tử có resource-id, hãy dùng nó làm tiêu chí chính.\n\n### content-desc\n\nThuộc tính này thường dùng cho nút biểu tượng không có chữ, hoặc cho các thành phần cần hỗ trợ người khiếm thị. Nếu nút không có resource-id nhưng có content-desc duy nhất, hãy dùng content-desc. Giá trị này cũng ít thay đổi hơn chữ hiển thị trên màn hình.\n\n### class\n\nLớp thành phần như `android.widget.Button` hoặc `android.widget.EditText` cho bạn biết loại thành phần, nhưng không đủ để xác định duy nhất một phần tử. Hãy dùng lớp kết hợp với mã định danh của thành phần cha để thu hẹp phạm vi tìm kiếm.\n\n### text\n\nHãy tránh dùng chữ hiển thị làm tiêu chí chính. Chữ có thể đổi theo ngôn ngữ ứng dụng, theo nội dung động, hoặc theo thiết kế mới. Ví dụ nút \"Tiếp theo\" có thể đổi thành \"Tiếp\" hoặc \"Next\" sau khi cập nhật, khiến flow bị lỗi.\n\n### index\n\nChọn phần tử theo vị trí thứ ba, thứ năm trong danh sách rất dễ bị sai khi có mục mới được chèn vào đầu danh sách. Chỉ dùng vị trí khi không có cách nào khác, và luôn kết hợp với thuộc tính cha ổn định.\n\n## Bước 3: Xây dựng selector bền vững cho các trường hợp phổ biến\n\nDưới đây là ba trường hợp thường gặp khi tự động hoá ứng dụng Android, và cách chọn phần tử phù hợp trong Phoma.\n\n### Trường hợp 1: Ô nhập liệu có mã định danh cố định\n\nGiả sử bạn muốn nhập email vào form đăng nhập. Màn hình có ô nhập với mã định danh `com.ungdung:id/o_nhap_email`. Bạn thực hiện:\n\n- Mở Element Inspector.\n- Chạm vào ô nhập email trên điện thoại. Phoma sẽ tô sáng nút và hiển thị resource-id.\n- Trong Phoma, thêm bước Nhập văn bản, chọn phần tử theo resource-id `com.ungdung:id/o_nhap_email`, rồi nhập nội dung cần kiểm tra.\n\nVì mã định danh này không phụ thuộc vào chữ gợi ý hay nội dung hiện tại, flow sẽ vẫn hoạt động ngay cả khi bạn đổi chữ gợi ý từ \"Nhập email\" thành \"Địa chỉ email\".\n\n### Trường hợp 2: Nút biểu tượng không có mã định danh\n\nMột số ứng dụng dùng nút biểu tượng menu hoặc nút đóng mà không gán resource-id, nhưng gán content-desc như \"Mở menu chính\" hoặc \"Đóng màn hình\". Bạn hãy:\n\n- Kiểm tra Element Inspector xem nút đó có content-desc không.\n- Nếu có, chọn bước Nhấn phần tử và dùng content-desc làm tiêu chí.\n- Nếu không có content-desc, hãy dùng lớp thành phần kết hợp với mã định danh của thành phần cha, ví dụ thanh công cụ trên cùng màn hình.\n\n### Trường hợp 3: Danh sách dài\n\nTrong danh sách sản phẩm hoặc danh sách khách hàng, mỗi mục thường có cấu trúc giống nhau. Nếu bạn chọn mục theo vị trí thứ hai, flow sẽ sai khi có sản phẩm mới được thêm vào đầu danh sách.\n\nCách tốt hơn là:\n\n- Tìm mã định danh của toàn bộ danh sách, ví dụ `com.ungdung:id/danh_sach_san_pham`.\n- Tìm thuộc tính duy nhất của mục cần tác động, ví dụ content-desc của sản phẩm là mã khách hàng hoặc tên sản phẩm.\n- Trong Phoma, chọn phần tử con trong danh sách bằng cách kết hợp cha và thuộc tính duy nhất, thay vì dùng chỉ số vị trí.\n\n## Bước 4: Kiểm tra độ ổn định trước khi lưu flow\n\nSau khi chọn phần tử, bạn không nên lưu flow ngay lập tức mà cần kiểm tra xem selector có thật sự bền vững không.\n\n- Nhấn Làm mới trong Element Inspector rồi chọn lại cùng một phần tử. Nếu resource-id hoặc content-desc thay đổi, selector không ổn định.\n- Chạy flow hai đến ba lần trên cùng một thiết bị. Nếu flow thành công mọi lần, khả năng selector tốt.\n- Thay đổi ngôn ngữ ứng dụng nếu ứng dụng hỗ trợ đa ngôn ngữ. Nếu flow vẫn chạy, nghĩa là bạn không phụ thuộc vào chữ hiển thị.\n- Cập nhật ứng dụng lên phiên bản mới nhất nếu có bản beta và chạy lại flow. Nếu phần tử vẫn được tìm thấy, selector đã vượt qua thử nghiệm thực tế.\n\n## Bước 5: Ví dụ thực tế – Flow kiểm tra form liên hệ\n\nDưới đây là ví dụ xây dựng flow kiểm tra form liên hệ trên một ứng dụng Android, dùng Phoma trên Windows.\n\n1. **Mở ứng dụng** – Thêm bước Mở ứng dụng, chọn gói ứng dụng và hoạt động chính. Điều này đảm bảo ứng dụng luôn ở trạng thái sẵn sàng trước khi bắt đầu.\n2. **Chạm nút Liên hệ** – Dùng Element Inspector tìm nút Liên hệ. Nếu nút có resource-id `com.ungdung:id/btn_lien_he`, chọn nó. Nếu không, dùng content-desc \"Mở form liên hệ\".\n3. **Nhập tên** – Thêm bước Nhập văn bản, chọn ô nhập tên theo resource-id `com.ungdung:id/o_ten`, nhập nội dung ví dụ \"Nguyen Van A\".\n4. **Nhập email** – Tương tự, chọn ô nhập email theo resource-id `com.ungdung:id/o_email`, nhập \"nguyenvana@example.com\".\n5. **Nhập nội dung** – Chọn ô nội dung theo resource-id `com.ungdung:id/o_noi_dung`, nhập nội dung tin nhắn.\n6. **Nhấn Gửi** – Chọn nút Gửi theo resource-id hoặc content-desc ổn định.\n7. **Chờ thông báo thành công** – Thêm bước Chờ phần tử, chọn phần tử thông báo thành công với thời gian chờ 5 giây. Tránh dùng chờ cố định vì thời gian phản hồi của máy chủ có thể thay đổi.\n8. **Chụp ảnh màn hình** – Thêm bước Chụp ảnh màn hình và lưu kết quả vào thư mục dự án để xem xét sau này.\n\nDưới đây là minh họa cấu trúc bước trong dạng JSON (chỉ để tham khảo, trong Phoma bạn thực hiện bằng giao diện trực quan, không viết code):\n\n```json\n{\n  \"buoc\": \"mo_ung_dung\",\n  \"goi\": \"com.ungdung\",\n  \"hoat_dong\": \"MainActivity\"\n},\n{\n  \"buoc\": \"nhan_phan_tu\",\n  \"chuan\": \"resource-id com.ungdung:id/btn_lien_he\"\n},\n{\n  \"buoc\": \"nhap_van_ban\",\n  \"chuan\": \"resource-id com.ungdung:id/o_ten\",\n  \"noi_dung\": \"Nguyen Van A\"\n},\n{\n  \"buoc\": \"cho_phan_tu\",\n  \"chuan\": \"resource-id com.ungdung:id/thong_bao_thanh_cong\",\n  \"thoi_gian_cho\": 5000\n}\n```\n\nLý do từng bước:\n\n- Bước mở ứng dụng tránh lỗi \"không tìm thấy phần tử\" do ứng dụng chưa khởi động.\n- Dùng resource-id hoặc content-desc giúp selector không bị vỡ khi giao diện được thiết kế lại.\n- Bước chờ phần tử thay cho chờ cố định giúp flow thích hợp với tốc độ phản hồi thực tế của ứng dụng.\n- Chụp ảnh màn hình giúp bạn xác nhận kết quả trực quan mà không cần nhìn điện thoại trong suốt quá trình chạy.\n\n## Bước 6: Lỗi phổ biến và cách sửa\n\n### Lỗi không tìm thấy phần tử\n\nNguyên nhân thường là resource-id sai, phần tử chưa xuất hiện, hoặc ứng dụng đang hiển thị màn hình khác. Cách sửa:\n\n- Kiểm tra lại kết nối ADB bằng lệnh `adb devices` trên Command Prompt.\n- Mở Element Inspector và xác nhận phần tử còn tồn tại trên màn hình hiện tại.\n- Thêm bước Chờ phần tử trước bước tác động, thay vì chạy ngay lập tức.\n\n### Lỗi nhấn sai phần tử\n\nKhi nhiều phần tử có cùng resource-id, Phoma có thể nhấn vào phần tử không mong muốn. Cách sửa:\n\n- Dùng content-desc duy nhất nếu có.\n- Kết hợp với mã định danh của thành phần cha để xác định chính xác vị trí.\n- Tránh dùng chỉ số vị trí trong danh sách trừ khi bắt buộc.\n\n### Flow chạy không ổn định sau khi cập nhật ứng dụng\n\nNếu sau khi cập nhật ứng dụng flow bắt đầu lỗi, hãy mở lại Element Inspector và so sánh thuộc tính cũ và mới. Nếu resource-id đã đổi, hãy chuyển sang content-desc hoặc lớp thành phần kết hợp cha.\n\n## Kết luận\n\nChọn phần tử ổn định là yếu tố then chốt để flow tự động hoá Android trong Phoma chạy ổn định dài hạn. Hãy ưu tiên resource-id và content-desc, tránh chữ hiển thị và chỉ số vị trí, và luôn kiểm tra selector trước khi lưu flow. Khi làm theo quy trình này, bạn sẽ giảm thiểu lỗi giả dương, tiết kiệm thời gian gỡ lỗi, và có thể mở rộng flow cho nhiều thiết bị hoặc nhiều kịch kiểm tra mà không lo lắng về việc giao diện ứng dụng thay đổi.\n\nHãy bắt đầu với một form đơn giản trên điện thoại kiểm tra của bạn, áp dụng các bước ở trên, và dần dần xây dựng thư viện flow ổn định cho dự án Android của mình.\n","https://blog-api.phomaapp.com/api/blog/posts/chon-phan-tu-on-dinh-phoma/assets",1793780243853]