Tự động hóa
Các node đọc màn hình
Element là gì, vì sao kịch bản phải chờ thay vì bấm luôn, và cách bốn node Chờ element, Đọc chữ, Đếm phần tử, Chụp màn hình phối hợp với nhau.
6 phút đọc
Một kịch bản bấm mà không nhìn thì chạy được đúng một lần — trên cái máy bạn dựng nó, vào cái ngày bạn dựng nó. Bốn node dưới đây cho kịch bản nhìn trước khi ra tay, và đó chính là thứ phân biệt một kịch bản sống sót được với máy thật và một kịch bản thì không. Hai trong bốn node nằm ở nhóm Element (ELEMENTS) của thư viện; hai node còn lại thì không, và mỗi cái sẽ nói rõ ở dưới.
"Element" nghĩa là gì
App dùng đúng một từ cho khái niệm này, và phần gợi ý trong trình soạn thảo đã nói dễ hiểu hết mức: "Element là một thành phần trên màn hình (nút, ô nhập, dòng chữ)."
Chỉ có vậy thôi. Nút Đăng nhập là một element. Ô mật khẩu là một element. Dòng chữ "3 tin nhắn mới" là một element. Khi bạn bảo kịch bản bấm vào cái gì đó, bạn hoặc đưa cho nó một điểm trên mặt kính — mà điểm thì xê dịch — hoặc mô tả một element để máy tự đi tìm.
Mô tả element là cả một chủ đề riêng: xem So khớp element trên màn hình, và xem Tìm element bằng UI Inspector để biết cách nhìn ra trên màn hình đang thật sự có những gì.
Hiếm khi bạn cần nhiều hơn một điều kiện để tả một element. Chính trình soạn thảo cũng nói vậy: "Một điều kiện là đủ trong hầu hết trường hợp. Chỉ thêm nhóm khi màn hình có nhiều phần tử giống nhau." Cứ bắt đầu đơn giản, chỉ thêm khi máy chọn nhầm.
Vì sao phải chờ thay vì bấm luôn
App không bao giờ mất đúng một khoảng thời gian hai lần liên tiếp. Cùng một màn đăng nhập, mạng tốt thì hiện sau nửa giây, mạng dở thì bốn giây. Kịch bản bấm vào một thời điểm cố định là đang cược rằng hôm nay giống y cái hôm bạn ngồi thử.
Chờ element thì xoá luôn ván cược đó. Kịch bản đi tiếp ngay khoảnh khắc thứ đó xuất hiện, không sớm hơn — tức là vừa nhanh hơn vào ngày đẹp trời, vừa chắc chắn hơn vào ngày xấu trời. Đây là khác biệt lớn nhất giữa một kịch bản chạy được một lần và một kịch bản bạn dám để nó tự chạy.
Chờ element — và cái node kiểm tra không hề tồn tại
Chờ element (Wait for element) chờ tới khi element bạn mô tả hiện ra rồi mới đi tiếp. Bạn khai ô Element cần chờ và Thời gian chờ element (ms).
Người mới hay đi tìm một node tên kiểu "element này có tồn tại không?" và không tìm ra. Chính là node này. Mô tả của nó nói thẳng mẹo đó: "Kiêm luôn vai kiểm tra có/không: đặt thời gian chờ ngắn và nối nhánh Lỗi làm đường "không thấy"."
Thêm node Chờ element và mô tả thứ cần kiểm — ví dụ dòng tiêu đề "Xác minh email".
Đặt thời gian chờ ngắn. Bạn đang đặt một câu hỏi, không phải đang đợi một màn hình chậm.
Nối đầu ra thường sang nhánh "có", và nối đầu ra Lỗi sang nhánh "không".
Đầu ra Lỗi ở đây không phải thứ tuỳ chọn: "Không thấy trong thời gian chờ → đi nhánh Lỗi; không nối Lỗi thì kịch bản dừng thất bại."
Tức là để trống nhánh Lỗi sẽ biến một chuyện hết sức bình thường — "lần này cái popup không hiện" — thành một lượt chạy hỏng. Đã dùng node này làm phép kiểm thì bắt buộc phải nối nhánh Lỗi đi đâu đó.

Đọc chữ trên màn hình
Đọc chữ trên màn hình (Read text on screen) — trong thư viện nó nằm ở nhóm Biến (VARIABLES), vì việc của nó là đổ dữ liệu vào một biến — chép nội dung của một element vào biến, và đó là cách kịch bản phản ứng theo nội dung thay vì theo bố cục: đọc số dư, đọc câu báo lỗi, đọc mã vừa về.
Chọn element, rồi chọn biến ở ô Lưu vào biến. Chỉ chọn được biến thuộc về kịch bản: "Chỉ chọn được biến của kịch bản (không phải biến người chạy nhập) và đúng kiểu. Tạo biến mới ở panel Biến." Danh sách trống nghĩa là bạn chưa khai biến nào — xem Biến và dữ liệu kịch bản.
Rồi tới cái ô giải được vấn đề khó hiểu nhất trong cả bài này:
Đọc ra chuỗi rỗng, trong khi element rành rành nằm đó.
Ô Đọc thuộc tính giải thích: "Nhiều app chỉ đặt mô tả (content-description) chứ không có text — chọn “Mô tả” khi text trống."
Rất nhiều nút, nhất là nút chỉ có mỗi cái icon, hoàn toàn không mang chữ nào nhìn thấy được — thứ nó có là một dòng mô tả dành cho trình đọc màn hình. Đổi thuộc tính sang Mô tả là giá trị hiện ra.
Khi chữ đã nằm trong biến thì bạn rẽ nhánh theo nó bằng node Nếu (If) — nhớ đổi So sánh kiểu sang Số nếu đó là con số, như đã nói ở bài Các node điều khiển luồng chạy.
Đếm phần tử
Đếm phần tử (Count elements) đếm tất cả những thứ khớp mô tả của bạn rồi ghi con số vào biến. Dùng nó để hỏi những câu mà một element đơn lẻ không trả lời được:
- Danh sách có rỗng không? Đếm ra 0.
- Trang nạp xong chưa? Số dòng lớn hơn 0.
- Vòng lặp nên chạy mấy lượt? Đếm trước, rồi đưa con số đó vào node Lặp N lần (Repeat N times).
Vì nó trả về một con số chứ không rẽ nhánh, hãy nối tiếp một node Nếu hoặc Rẽ nhiều nhánh (Switch) để quyết định con số đó nghĩa là gì.
Đếm còn cho bạn biết lúc nào mô tả element bị lỏng quá. Bạn tưởng chỉ có một nút Đăng nhập mà đếm ra chín, thì điều kiện của bạn đang khớp nhiều hơn hẳn ý bạn — và node nào thao tác lên một element đều có ô Vị trí (Position) cho đúng tình huống đó: "Nếu có nhiều element cùng khớp, chọn cái thứ mấy — đếm từ 0. Bỏ trống là lấy cái đầu tiên."
Chụp màn hình
Chụp màn hình (Screenshot), trong thư viện nằm ở nhóm Thiết bị (DEVICE), chụp lại màn hình hiện tại theo cái tên bạn đặt, và đó là bằng chứng mà bạn sẽ ước gì mình có, khi một lượt chạy hỏng lúc nửa đêm.
Ô Tên ảnh chặt chẽ hơn vẻ ngoài của nó: "Ảnh lưu trên máy đúng theo tên này — node sau hoặc người vận hành lấy lại được theo tên. Trùng tên thì ghi đè; chèn {{biến}} để phân biệt từng lượt."
Vế cuối rất quan trọng khi node này nằm trong vòng lặp. Tên cố định nghĩa là lượt sau đè lượt trước, và cuối cùng bạn chỉ còn đúng một tấm ảnh của lượt thứ hai mươi. Nhét biến vào tên — check_{{account}} hay luot_{{i}} — là mỗi lượt một tấm.
Node Dừng kịch bản (Stop flow) cũng chụp được một tấm lúc nó kết thúc, và cả hai đổ về cùng một chỗ. Cộng lại, bạn có ảnh của chặng đường lượt chạy đã đi tới, và ảnh của chỗ nó dừng lại.
Tóm tắt
- Element là "một thành phần trên màn hình (nút, ô nhập, dòng chữ)" — hãy mô tả nó thay vì chỉ vào một toạ độ, và khởi đầu bằng một điều kiện thôi.
- Chờ element kiêm luôn cái node "có tồn tại không?" mà bạn đi tìm: thời gian chờ ngắn, nhánh Lỗi nối làm đường "không thấy". Để trống nhánh Lỗi là biến một chuyện vắng mặt bình thường thành lượt chạy hỏng.
- Đọc chữ trên màn hình đổ giá trị vào biến; đọc ra rỗng thì đổi Đọc thuộc tính sang Mô tả.
- Đếm phần tử trả lời câu "bao nhiêu cái", kể cả câu trả lời hữu ích là 0 — và một con số to bất ngờ nghĩa là mô tả element của bạn đang lỏng quá.
- Nhét
{{biến}}vào Tên ảnh của node Chụp màn hình, không thì mỗi lượt lặp lại đè mất tấm ảnh của lượt trước.