Bỏ qua, đến nội dung

Điều kiện ​

Chạy command có điều kiện dựa trên khả năng hiển thị, nền tảng hoặc biểu thức tùy chỉnh.

Điều kiện cho phép bạn chỉ thực thi lệnh hoặc cả flow khi thỏa tiêu chí nhất định. Điều này hữu ích để xử lý logic theo nền tảng (Android so với iOS), quản lý A/B test, hoặc xử lý các phần tử UI động như màn hình onboarding hay hộp thoại xin quyền.

Mẹo: giữ test đơn giản

Lạm dụng logic điều kiện có thể khiến flow khó đọc và khó debug. Hãy ưu tiên các flow riêng cho những kịch bản khác biệt đáng kể.

Các điều kiện được hỗ trợ ​

Trong flow, điều kiện chủ yếu được xử lý bằng tham số when. Tham số này có thể gắn vào nhiều lệnh. Nếu điều kiện trong khối when có giá trị true, Astra Scout thực thi lệnh; ngược lại Astra Scout bỏ qua lệnh đó và chuyển sang lệnh kế tiếp.

Bảng sau liệt kê các điều kiện bạn có thể dùng để xác định việc thực thi có điều kiện của flow.

Điều kiệnMô tả
visibleThực thi nếu phần tử khớp selector đang hiển thị. Phần tử phải được xác định bằng một hoặc nhiều Selector.
notVisibleThực thi nếu phần tử khớp selector không hiển thị. Phần tử phải được xác định bằng một hoặc nhiều Selector.
platformThực thi nếu nền tảng hiện tại khớp (Android hoặc iOS).
trueThực thi nếu biểu thức JavaScript có giá trị true.

Các trường hợp sử dụng thường gặp ​

Xử lý khác biệt giữa các nền tảng ​

App thường có UI hoặc hành vi khác nhau trên Android và iOS. Bạn có thể dùng điều kiện platform để chạy các flow riêng cho từng nền tảng.

Trong ví dụ này, test thực thi một subflow cụ thể để xử lý quyền, tùy device đang chạy Android hay iOS.

yaml
- runFlow:
    when:
      platform: Android
    file: subflows/android-permissions.yaml

- runFlow:
    when:
      platform: iOS
    file: subflows/ios-permissions.yaml

Xử lý trạng thái động ​

Đôi khi một phần tử có thể xuất hiện hoặc không, như popup "Rate this App" hay form đăng ký nhận bản tin. Bạn có thể xử lý các trạng thái động này bằng hai mẫu khác nhau:

Khối runFlow / when

Đây là cách viết tự nhiên nhất để xử lý điều kiện. Nó nêu rõ ý định "Chỉ chạy các lệnh này khi điều kiện này được thỏa". Bạn kết hợp runFlow và when:

yaml
- runFlow:
    when:
      visible: "Dismiss"
    commands:
      - tapOn: "Dismiss"

Property optional

Dùng property optional đơn giản hơn cho các tương tác chỉ một lệnh. Nó cho phép step đó fail mà không làm cả test fail. Thêm label giúp giải thích rõ vì sao step này tồn tại.

yaml
- tapOn:
    text: "Dismiss"
    optional: true
    label: "Dismiss popup if it exists"

Mẹo

Dựa vào trạng thái UI không ổn định làm điều kiện có thể khiến test flaky. Hãy đảm bảo selector visible của bạn là duy nhất và đáng tin cậy.

Dùng notVisible cho điều kiện phủ định ​

Bạn có thể dùng điều kiện notVisible để xử lý các tình huống đảo ngược hoặc "else", khi một hành động chỉ nên xảy ra lúc một phần tử cụ thể không có trên màn hình.

Ví dụ, lệnh sau chạm Standard Login chỉ khi Biometric Login (không bắt buộc) không hiển thị. Ở đây dùng lệnh runFlow vì bản thân lệnh tapOn không hỗ trợ logic điều kiện:

yaml
- runFlow:
    when:
      notVisible: "Biometric Login"
    commands:
      - tapOn: "Standard Login"

Cách này cho phép test thích ứng với các trạng thái UI khác nhau.

Chạy nhiều lệnh ​

Bạn không phải lúc nào cũng cần tạo file riêng cho các step có điều kiện. Có thể dùng danh sách commands để khai báo nhiều hành động ngay tại chỗ.

Trong ví dụ này, nếu văn bản "Welcome to our App" đang hiển thị, flow thực thi một chuỗi thao tác chạm để đi qua màn hình onboarding.

yaml
- runFlow:
    when:
      visible: "Welcome to our App"
    commands:
      - tapOn: "Next"
      - tapOn: "Get Started"

Nhiều điều kiện ​

Bạn có thể kết hợp nhiều điều kiện trong một khối when. Lưu ý rằng mọi điều kiện đều phải thỏa (logic AND) thì lệnh mới được thực thi.

Trong ví dụ này, nút Allow chỉ được chạm nếu nền tảng là Android VÀ văn bản Allow Notifications đang hiển thị.

yaml
- runFlow:
    when:
      platform: Android
      visible: "Allow Notifications"
    commands:
      - tapOn: "Allow"

Logic nâng cao với JavaScript ​

Với logic phức tạp hơn, như feature flag hoặc kiểm tra biến, dùng điều kiện true với một biểu thức JavaScript.

Trong ví dụ này, subflow new-feature-test.yaml chỉ được thực thi nếu biến IS_FEATURE_ENABLED có giá trị true.

yaml
- runFlow:
    when:
      true: ${IS_FEATURE_ENABLED == true}
    file: subflows/new-feature-test.yaml

Nếu điều kiện JavaScript dài hơn một dòng, hãy chuyển logic sang file .js riêng và dùng biến output để giữ YAML gọn gàng.

Ví dụ sau cho thấy cách chuyển logic sang file ngoài. Đầu tiên, tạo script logic:

javascript
// checkFeature.js
output.shouldRunTest = (maestro.platform === 'android' && someComplexCalculation() > 10);

Sau đó tham chiếu nó trong flow:

yaml
- runScript: checkFeature.js
- runFlow:
    when:
      true: ${output.shouldRunTest}
    file: subflows/advanced-test.yaml

Step tiếp theo ​

Giờ bạn đã hiểu cách dùng điều kiện trong flow, hãy tìm hiểu cách dùng tham số và hằng số hoặc khám phá mọi khả năng của JavaScript để tạo test.