Phát hiện Maestro
Phát hiện app đang chạy dưới tự động hóa của Astra Scout để bật hành vi riêng cho test.
Developer của app có thể cho app hành xử khác đi khi đang được test: bỏ qua màn hình 2FA (xác thực hai lớp), tắt analytics để không làm nhiễu dữ liệu production, hoặc trỏ tới mock server (server giả dùng để test).
Astra Scout chạy flow bằng maestro-runner, một bản fork của Maestro (công cụ mã nguồn mở chạy test UI cho app mobile). Vì vậy tên gọi "Maestro" xuất hiện trong code app: bạn cho flow gửi một cờ vào app lúc khởi chạy, và app đọc cờ đó để biết mình đang được test.
Vì sao cần phát hiện?
Biết app đang được test giúp xử lý những tình huống khó tự động hóa:
- Bỏ qua 2FA: dùng mã cố định thay vì mã gửi qua SMS hoặc email, nên không cần SIM thật hay hộp thư.
- Giữ nội dung lâu hơn: để các thông báo tự biến mất nhanh (như banner tạm thời) ở lại màn hình lâu hơn, cho Astra Scout đủ thời gian tìm thấy và tương tác.
- Đổi môi trường: tự trỏ app tới mock server hoặc database staging để dữ liệu production không bị lẫn test.
- Tắt animation tùy chỉnh: nếu app có animation mà
waitForAnimationToEndkhông chờ được, tắt nó khi test để tránh tap trượt (tap vào lúc phần tử còn đang chuyển động).
Mobile (iOS và Android)
Cách nên dùng trên mobile là truyền launchApp arguments từ flow. Cách này ổn định và dễ hiểu.
Truyền đối số trong flow
Trong flow, dùng tham số arguments của launchApp để gửi một cờ tùy chỉnh.
Thông tin: launch argument trong Astra Scout
Astra Scout truyền arguments cho maestro-runner, rồi maestro-runner chuyển chúng cho app lúc khởi chạy. Trên iOS chúng tới app dưới dạng launch argument -key value, nên ProcessInfo.processInfo.arguments chứa -isMaestro. Trên Android, chạy thử nhanh để xác nhận cách app nhận giá trị trước khi dựa vào nó.
- launchApp:
appId: "com.example.app"
arguments:
isMaestro: "true"Đọc đối số trong code app
App kiểm tra cờ này khi khởi động.
Android (Kotlin/Java)
val isMaestro = intent.getStringExtra("isMaestro") == "true"
if (isMaestro) {
// Tắt analytics hoặc dùng dữ liệu giả
}iOS (Swift)
if ProcessInfo.processInfo.arguments.contains("-isMaestro") {
// Áp dụng cấu hình chỉ dành cho test
}React Native
Với React Native, dùng thư viện như react-native-launch-arguments để lấy các tham số truyền lúc khởi động.
import { LaunchArguments } from 'react-native-launch-arguments';
if (LaunchArguments.value().isMaestro === "true") {
// Áp dụng cấu hình chỉ dành cho test
}Flutter
Với Flutter, cách đơn giản nhất là dùng package như flutter_launch_arguments để lấy tham số từ flow, không cần tự viết platform channel:
import 'package:flutter_launch_arguments/flutter_launch_arguments.dart';
Future<void> getArguments() async {
final fla = FlutterLaunchArguments();
final foo = await fla.getString('foo');
final isFooEnabled = await fla.getBool('isFooEnabled');
final fooValue = await fla.getDouble('fooValue');
final fooInt = await fla.getInt('fooInt');
}Nội dung liên quan
launchApp: reference đầy đủ về truyền launch argument.
