Chọn ảnh từ thư viện
Chọn ảnh từ thư viện của device trong test tự động bằng addMedia.
Tải ảnh lên hoặc cập nhật ảnh đại diện là tính năng quen thuộc trong các app mobile hiện đại. Tuy nhiên tự động hóa việc này khó vì "Media Picker" thực ra không thuộc app của bạn, mà là thành phần cấp hệ thống, trông và hoạt động khác nhau tùy OS và phiên bản Android hay iOS cụ thể.
Astra Scout có lệnh addMedia để nạp ảnh vào device, nhưng việc chọn media đó đòi hỏi điều hướng qua nhiều UI hệ thống khác nhau.
Quy trình
Vì media picker là một tiến trình hệ thống bên ngoài, bạn không thể dựa vào ID nội bộ của app. Thay vào đó, bạn cần nhắm vào các phần tử gốc của OS. Chiến lược ở đây là:
- Đảm bảo thư viện không trống. Bạn có thể làm bằng cách dùng lệnh
addMediatrước flow này hoặc để test chụp một ảnh bằng camera device. - Kích hoạt bộ chọn ảnh trong app.
- Dùng một loạt thao tác chạm optional nhắm vào các ID hệ thống đã biết cho từng phiên bản OS.
- Dự phòng lần run cho đến khi tìm được kết quả khớp.
1. Flow chọn ảnh tái sử dụng
Flow này (ví dụ pick_first_image.yaml) đóng vai trò bộ chuyển đổi đa năng. Nó cố nhận diện ảnh thu nhỏ đầu tiên trong thư viện bằng cách thử lần run các ID phổ biến mà Google và Apple dùng qua nhiều phiên bản SDK.
# pick_first_image.yaml
# Yêu cầu: ảnh phải có sẵn trong thư viện của thiết bị
# Chiến lược: thử các selector riêng của từng nền tảng với 'optional: true'
appId: ${APP_ID}
---
# Bước 1: chọn media trên Android
# Các phiên bản Android khác nhau dùng trình quản lý file nền khác nhau.
- runFlow:
when:
platform: Android
commands:
# Nhắm vào Media Provider của Android SDK 33/34 hiện đại
- tapOn:
id: 'com.google.android.providers.media.module:id/icon_thumbnail'
optional: true
# Dự phòng cho selector của SDK 30 cũ hơn (DocumentsUI)
- tapOn:
id: 'com.google.android.documentsui:id/thumbnail'
optional: true
# Bước 2: chọn media trên iOS
# iOS 18 đưa vào layout lưới mới, còn các bản cũ dựa vào accessibility label.
- runFlow:
when:
platform: iOS
commands:
# Nhắm vào layout lưới mới của iOS 18
- tapOn:
id: 'PXGGridLayout-Info'
index: 0
optional: true
# Dự phòng cho iOS 17 trở xuống bằng regex của accessibility label
- tapOn:
text: 'Photo, .*'
index: 0
optional: trueTrong một flow tiêu chuẩn, một tapOn fail sẽ dừng việc thực thi. Tuy nhiên, vì ta biết selector của iOS 18 sẽ fail trên device iOS 17, ta đánh dấu các step này là optional bằng optional: true.
Astra Scout sẽ thử lần run từng selector. Ngay khi tìm thấy kết quả khớp, nó thực hiện thao tác chạm và đi tiếp. Nếu một selector không khớp, nó chỉ bỏ qua sang selector kế tiếp mà không làm test fail. Nhờ vậy bạn có thể viết một flow vững chắc duy nhất chạy được trên hệ sinh thái phân mảnh các phiên bản device.
2. Triển khai
Để dùng trong bộ test chính, hãy đảm bảo thư viện có nội dung (qua addMedia hoặc một thao tác camera trước đó), rồi gọi subflow khi bộ chọn đã mở:
# main_test.yaml
- tapOn: "Upload Profile Picture"
- runFlow: ../partials/pick_first_image.yamlNội dung liên quan
Khám phá các trang tài liệu sau nếu bạn muốn tìm hiểu sâu hơn về các lệnh dùng trong công thức này:
- addMedia: tìm hiểu cách đưa ảnh hoặc video vào thư viện của device.
