Bỏ qua, đến nội dung

Quyền ​

Cấu hình quyền của app khi khởi chạy hoặc giữa flow khi test iOS và Android.

Quản lý quyền hệ thống là thách thức thường gặp trong tự động hóa test mobile. Vì các prompt của OS (như "Allow Camera Access") thường chỉ hiện một lần, hành trình test có thể trở nên không nhất quán nếu trạng thái app không được reset.

Flow giải quyết điều này bằng cách cho phép bạn cấu hình quyền một cách tường minh, lúc khởi chạy hoặc trong flow, đảm bảo môi trường dự đoán được mỗi lần.

Cấu hình quyền khi khởi chạy ​

Cách dễ nhất để quản lý quyền là trong lệnh launchApp. Mặc định, Astra Scout cấp mọi quyền, nhưng bạn có thể ghi đè hành vi này để test các kịch bản cụ thể.

Để tùy chỉnh quyền khi khởi chạy, bạn cần chỉ định chúng khi gọi launchApp. Ví dụ sau từ chối mọi quyền nhưng cho phép tường minh camera và vị trí:

yaml
- launchApp:
    permissions:
      all: deny
      camera: allow
      location: allow

Đổi quyền giữa chừng trong flow ​

Đôi khi bạn cần đổi quyền khi app đang chạy, ví dụ để test cách app xử lý khi bị từ chối quyền, hoặc để chuẩn bị cho một flow tính năng cụ thể như quét mã QR. Dùng lệnh setPermissions cho mục đích này.

yaml
- setPermissions:
    permissions:
      notifications: allow

Các quyền khả dụng ​

Astra Scout dùng tên chuẩn hóa để flow chạy được trên nhiều nền tảng. Ví dụ, dùng bluetooth trên Android sẽ tự động nhắm cả BLUETOOTH_CONNECT và BLUETOOTH_SCAN.

Bảng sau liệt kê mọi quyền khả dụng trên iOS và Android.

QuyềniOSAndroid
bluetooth❌✅
calendar✅✅
camera✅✅
contacts✅✅
health❌❌
homekit✅❌
location✅✅
medialibrary✅✅
microphone✅✅
motion✅❌
notifications✅✅
phone❌✅
photos✅❌
reminders✅❌
siri✅❌
sms❌✅
speech✅❌
storage❌✅
usertracking✅❌

Mẹo

Để cấp mọi quyền khả dụng, dùng all: allow để đại diện cho tất cả quyền mà app có thể yêu cầu.

Quyền tùy chỉnh trên Android ​

Nếu một quyền Android cụ thể không có trong danh sách trên, bạn có thể dùng đầy đủ Permission ID của Android. Ví dụ sau thêm quyền ADD_VOICEMAIL:

yaml
- setPermissions:
    permissions:
      com.android.voicemail.permission.ADD_VOICEMAIL: allow

Thông tin

Lưu ý all: allow cũng bao gồm các quyền tùy chỉnh, nên bạn không cần chỉ định từng quyền trừ khi muốn từ chối mọi thứ còn lại.

Quyền đặc biệt trên Android ​

Không phải quyền nào cũng được hỏi ngay trong app, như quyền vị trí. Một số quyền yêu cầu người dùng rời app và cấp quyền trong app Settings.

Quyền android.permission.MANAGE_EXTERNAL_STORAGE được yêu cầu từ Android 12 nếu app muốn truy cập file không phải của mình (ví dụ trình duyệt file, phần mềm quét virus).

Astra Scout có thể quản lý quyền này như các quyền khác mà không cần thêm tương tác của người dùng, hoạt động như "lần dùng thứ hai" của app thay vì lần đầu. Nếu quyền được khai báo trong AndroidManifest.xml của app thì nó sẽ được đặt tự động. Nếu muốn kiểm soát chi tiết, làm như với quyền tùy chỉnh:

yaml
- launchApp:
    clearState: true
    permissions:
      android.permission.MANAGE_EXTERNAL_STORAGE: deny

Giá trị của quyền ​

Bạn có thể đặt quyền ở một trong các trạng thái sau:

Giá trịMô tả
allowCấp quyền. Trên iOS, giá trị này cũng tự động đóng prompt của hệ thống.
denyTừ chối quyền. Android sẽ yêu cầu quyền trong lúc chạy flow nếu app cần truy cập một tính năng cụ thể.
unsetReset trạng thái quyền, khiến hệ thống hiện prompt xin quyền khi chạy flow.

Giá trị quyền có thể đến từ một biến hoặc biểu thức JavaScript thay vì viết cứng:

yaml
appId: com.example.app
env:
  CAMERA_PERMISSION_STATE: deny
---
- launchApp:
    permissions:
      camera: ${CAMERA_PERMISSION_STATE}

Nhờ vậy một flow có thể bao phủ cả hành trình được cấp quyền lẫn bị từ chối, điều khiển bằng biến môi trường của Astra Scout hoặc khối env của flow gọi.

Thông tin: push notification trên iOS

Khác với các quyền khác, iOS không cấp quyền thông báo một cách im lặng. Khi app yêu cầu quyền, prompt của hệ thống xuất hiện và Astra Scout tự động chạm Allow.

Trên Android, quyền được cấp im lặng, không có prompt.

Giá trị riêng của iOS ​

iOS hỗ trợ thêm các giá trị chi tiết cho một số quyền.

QuyềnGiá trịMô tả
locationalwaysCấp quyền vị trí Always Allow.
inuseCấp quyền vị trí While Using the App.
neverGiống deny.
photoslimitedCấp Limited Access cho thư viện ảnh.

Tự trả lời hộp xin quyền của iOS trong flow ​

Một số hộp không nằm trong permissions: quyền Local Network, hoặc App Tracking Transparency khi flow cần từ chối nó mà vẫn cho phép quyền khác. Hãy khởi chạy với all: unset để không có gì tự trả lời thay bạn, rồi trả lời từng hộp theo chữ trên đó. Khi một hộp thoại hệ thống nằm trên app, visible, assertVisible, extendedWaitUntil và điều kiện when khớp với tiêu đề, nội dung và nhãn nút của nó, còn tapOn bấm nút có nhãn đó. Chỉ selector chữ thuần mới tới được hộp thoại: selector id, index, tương đối và trạng thái chỉ nhìn vào app.

yaml
- launchApp:
    permissions: { all: unset }
- extendedWaitUntil:
    visible: ".*Would Like to Send You Notifications"
    timeout: 15000
- tapOn: "Don’t Allow"

Khi hai hộp có thể đến theo thứ tự bất kỳ, trả lời chúng trong một vòng lặp:

yaml
- repeat:
    times: 3
    while:
      visible: ".*to find devices on local networks\\?|.*to track your activity.*"
      timeout: 5000
    commands:
      - runFlow:
          when: { visible: ".*to find devices on local networks\\?" }
          commands:
            - tapOn: "Allow"
      - runFlow:
          when: { visible: ".*to track your activity.*" }
          commands:
            - tapOn: "Ask App Not to Track"

Nhãn nút dùng dấu nháy cong của iOS (Don’t Allow). Chỉ tapOn bấm được nút của hộp thoại: nhấn giữ, chạm hai lần hay chạm vào một điểm chỉ tác động lên app. Một launchApp có permissions trả lời hộp thoại theo cách khác lần khởi chạy trước (all: allow cho phép, all: deny từ chối, còn lại để flow tự trả lời) sẽ mở session tự động hoá mới, nên cách của flow trước không còn áp dụng.

Ví dụ sử dụng ​

Từ chối mọi quyền ​

Để đảm bảo app xử lý đúng trạng thái bị từ chối quyền, hãy bắt đầu flow bằng việc từ chối mọi thứ. Điều này buộc bạn xử lý các trường hợp biên khi người dùng từ chối prompt quyền của hệ thống.

yaml
- launchApp:
    permissions:
        all: deny

Từ chối tất cả nhưng cho phép một số quyền ​

Đây là mẫu thường dùng để test riêng từng tính năng.

yaml
- launchApp:
    permissions:
        all: deny
        medialibrary: allow
  • launchApp: xem reference đầy đủ về khởi chạy app.
  • setPermissions: lệnh để thay đổi cấu hình quyền giữa chừng trong flow.