Bỏ qua, đến nội dung

Quản lý dữ liệu và trạng thái ​

Chia sẻ dữ liệu giữa các script bằng đối tượng output toàn cục, namespace và copiedText.

Chia sẻ dữ liệu giữa các phần tử UI và script JavaScript là điều cần thiết để tạo test động và bền vững. Hướng dẫn này nói về cách dùng đối tượng global output, quản lý namespace và lấy văn bản trên UI để dùng trong logic.

Đối tượng output ​

Astra Scout cung cấp một đối tượng JavaScript global duy nhất tên là output, tồn tại trong suốt quá trình thực thi flow. Bất kỳ dữ liệu nào gán vào đối tượng này trong một script hoặc biểu thức đều có thể dùng ngay ở mọi script và lệnh phía sau.

Bạn có thể lưu chuỗi, số, boolean hoặc đối tượng phức tạp trong output. Bạn có thể truy cập hoặc thêm thông tin vào output bằng cú pháp JavaScript chuẩn. Trong ví dụ sau, giá trị 'Hello World' được gán cho result (một tên key tùy ý):

javascript
// myScript.js
output.result = 'Hello World'

Sau khi flow chạy myScript.js, giá trị được gán vào đối tượng global. Sau đó bạn có thể dùng giá trị này trong các lệnh tiếp theo, như inputText:

yaml
- runScript: myScript.js
- inputText: ${output.result}

Namespace cho output ​

Vì đối tượng output là global, các script khác nhau có thể vô tình ghi đè dữ liệu của nhau nếu dùng cùng tên biến. Để tránh điều này, hãy dùng namespace (đối tượng con đặt tên theo script hoặc tính năng cụ thể).

Ví dụ, thay vì gán biến trực tiếp vào gốc của output, hãy nhóm chúng theo ngữ cảnh:

javascript
output.auth = {
    token: "abc-123",
    expiry: 3600
};
javascript
output.profile = {
    username: "MaestroUser",
    role: "Admin"
};

Sau đó bạn truy cập dữ liệu này bằng cú pháp có namespace:

yaml
- inputText: ${output.auth.token}
- assertVisible: ${output.profile.username}

Hàm dùng chung ​

Đối tượng output có thể lưu cả hàm lẫn dữ liệu. Đây là mẫu mạnh để định nghĩa logic tái sử dụng, như helper API hay hàm định dạng chuỗi phức tạp, ngay từ đầu flow để mọi script phía sau đều gọi được.

Trong ví dụ này, ta định nghĩa hàm tạo token trong apiUtils.js và cho nó dùng global qua namespace output.utils:

javascript
// apiUtils.js
function generateToken(prefix) {
    return prefix + "_" + Math.random().toString(36);
}

output.utils = {
    generateToken: generateToken
};

Bằng cách nạp script trong onFlowStart, hàm generateToken trở thành tiện ích tái sử dụng cho phần còn lại của run:

yaml
onFlowStart:
    - runScript: apiUtils.js
---
# Gọi hàm dùng chung để tạo session token mới
- evalScript: ${output.sessionToken = output.utils.generateToken('session')}

Đối tượng maestro ​

Đối tượng maestro là tiện ích có sẵn cung cấp thông tin về môi trường test hiện tại và dữ liệu UI đã lấy.

PropertyMô tả
maestro.copiedTextChứa văn bản lấy được bởi lệnh copyTextFrom gần nhất.
maestro.platformNền tảng viết thường: ios hoặc android. Hữu ích cho logic điều kiện đa nền tảng.

Lấy văn bản từ UI ​

Để chuyển văn bản từ app vào logic JavaScript:

  1. Dùng lệnh copyTextFrom để lưu nội dung vào biến maestro.copiedText.
  2. Truy cập nội dung đó trong code JavaScript hoặc lệnh bằng maestro.copiedText.

Ví dụ sau sao chép nội dung từ phần tử userName và dùng nó để gửi một thông điệp động:

yaml
- copyTextFrom: 
    id: userName # Nhắm vào phần tử userName
- inputText: ${'Hello ' + maestro.copiedText} # Chào người dùng bằng tên đã lấy

Step tiếp theo ​

Giờ bạn đã biết cách quản lý dữ liệu khi dùng JavaScript trong flow, hãy xem các hướng dẫn sau: