Tự động hóa
Các node điều khiển luồng chạy
Bắt đầu, Dừng kịch bản, Chờ, Ghi log, Nếu, Rẽ nhiều nhánh và ba node lặp: dùng khi nào, điền gì, và những cái bẫy làm lượt chạy thành Thất bại.
8 phút đọc
Mười hai trong số 52 node không hề chạm vào màn hình. Chúng quyết định cái gì chạy, chạy theo thứ tự nào, lặp bao nhiêu lượt, và rẽ đường nào khi máy làm ra thứ bạn không tính trước. Nắm được nhóm này thì mấy node bấm, gõ và vuốt gần như tự lo được.
Phần lớn nằm ở hai nhóm Luồng chạy (FLOW) và Điều khiển (CONTROL) của thư viện. Hai node còn lại nằm chỗ khác, tới đâu sẽ nói tới đó. Không thấy node ở chỗ mình tưởng thì gõ vào ô "Tìm node…" trên đầu thư viện.
Bắt đầu và Dừng kịch bản
Bắt đầu (Start) là nơi lượt chạy khởi hành, và là node duy nhất không có đầu vào — mọi node khác đều có. Mỗi kịch bản cần một cái.
Dừng kịch bản (Stop flow) kết thúc lượt chạy tại điểm bạn chọn, và đây là chỗ nhiều người hiểu sai: bạn không cần nó chỉ để kết thúc. Một đầu ra bỏ trống thì kịch bản đã kết thúc thành công ngay tại đó rồi. Dùng Dừng kịch bản khi bạn muốn dừng và nói rõ vì sao. Ba ô làm việc đó:
- Mã kết quả — "Thành công: kịch bản kết thúc tốt. Thất bại: kịch bản dừng và được tính là chạy hỏng, người chạy sẽ thấy lỗi." Đây là cách duy nhất để đánh dấu một lượt chạy là hỏng có chủ ý, ví dụ app vừa báo "sai mật khẩu" thì đi tiếp cũng vô nghĩa.
- Thông báo — "Lời nhắn hiện trong kết quả chạy, để biết kịch bản dừng ở đâu và vì sao. Ghép được biến." Viết
Đăng nhập hỏng: {{account}}thì bạn biết hỏng ở tài khoản nào, chứ không chỉ biết "có cái gì đó hỏng". - Chụp màn hình khi dừng — giữ lại tấm ảnh máy đang hiện gì lúc đó.
Chờ, và vì sao ô nhập có hai đầu
Chờ (Wait) dừng một lát. Ô nhập là một khoảng hai đầu, và phần gợi ý nói rõ lý do: "Máy chọn ngẫu nhiên một giá trị trong khoảng này; đặt hai đầu bằng nhau là chờ cố định".
Đặt hai đầu cùng 2000 thì máy nào cũng chờ đúng hai giây. Đặt 1500–4000 thì mỗi máy tự bốc một con số riêng. Chuyện này quan trọng nhất khi một kịch bản chạy trên hai chục máy cùng lúc — xem Chạy một kịch bản trên nhiều máy — vì nhịp giống hệt nhau làm hai chục cái máy cử động như một cỗ máy duy nhất. Nhịp lệch nhau thì không tốn thêm gì cả.
Nhiều node còn có sẵn ô Chờ sau khi chạy (ms) của riêng nó, mô tả là "Nghỉ sau mỗi lần thực hiện, trước khi đi tiếp" với cùng kiểu bốc ngẫu nhiên — nên nhiều khi bạn không cần thêm node Chờ riêng.
Chờ một khoảng cố định luôn là một phép đoán: sáng máy chậm thì thiếu, máy nhanh thì phí. Khi bạn đang chờ cái máy chứ không phải chờ cái đồng hồ, hãy dùng Chờ element (Wait for element) — xem Các node đọc màn hình.
Ghi log — thứ đầu tiên nên với tới khi một lượt chạy làm bạn ngạc nhiên
Ghi log (Log) ghi một dòng vào nhật ký chạy, và phần gợi ý chính là toàn bộ mẹo: "Nội dung ghi vào nhật ký chạy — chèn {{biến}} để xem giá trị tại thời điểm đó."
Lượt chạy xong rồi thì bạn không mở nó ra xem lại được nữa. Thứ duy nhất còn lại là những gì nó đã tự ghi xuống. Vậy nên hãy cắm một Ghi log trước và một cái sau mỗi đoạn bạn chưa chắc, và nhét biến vào nội dung:
truoc khi dang nhap, account = {{account}}doc xong ma, otp = {{otp}}
Giờ nhật ký cho bạn biết cả hai thứ: kịch bản đã đi tới đâu, và lúc đó nó đang cầm giá trị gì. Cách đọc lại nhật ký ở bài Chạy kịch bản và theo dõi.
Nếu — hai hướng đi
Nếu (If) so hai giá trị rồi rẽ nhánh Đúng hoặc Sai. Vế trái "Thường là một biến, ví dụ {{example}}". Hai cái bẫy nằm ở mấy ô còn lại.
Vế phải không bao giờ là tên biến. Gợi ý nói thẳng: "Luôn được hiểu là giá trị chứ không phải tên biến hay biểu thức. Muốn lấy giá trị biến thì viết trong hai dấu ngoặc nhọn." Gõ count là đang so với đúng chữ count. Ý bạn là {{count}}.
So số theo kiểu chữ thì thứ tự sai. "So kiểu chữ thì "10" đứng trước "9"; muốn so đúng thứ tự số thì chọn Số." Mọi thứ đọc ra từ màn hình đều về dưới dạng chữ, nên hễ so tiền, so số lượng, so giá thì phải đổi So sánh kiểu sang Số.
Còn một ô nữa là Bỏ qua hoa thường, cứu bạn khỏi mấy app bản này ghi "Sign In" bản sau ghi "Sign in".
Rẽ nhiều nhánh — hơn hai hướng
Rẽ nhiều nhánh (Switch) lấy một giá trị rồi cho mỗi trường hợp một nhánh riêng: "Mỗi trường hợp là một nhánh riêng. Không trùng khớp cái nào thì đi nhánh Còn lại". Dùng nó ở chỗ mà nối một dây Nếu liên tiếp sẽ thành lố — một trạng thái có thể là chờ duyệt, đã duyệt hoặc bị từ chối thì là ba trường hợp cộng nhánh Còn lại, gọn trên một node.
Lần nào cũng nên nối Còn lại. Đó là nhánh hứng lấy cái giá trị bạn không nghĩ tới, và trước sau gì app cũng sẽ đưa cho bạn một cái.
Ba node lặp, và cái lỗi ai cũng mắc lần đầu
Vòng lặp là một cái HỘP CHỨA, không phải một sợi dây. Nếu bạn từng dùng công cụ flow khác, phản xạ sẽ là kéo một dây từ bước cuối vòng ngược lên đầu. Không được: "không được nối ngược tạo vòng."
Mỗi node lặp có hai đầu ra: Thân vòng lặp và Tiếp. Nối Thân vòng lặp tới bước đầu tiên cần lặp lại. Những node đó sẽ được tô thành một khung có nhãn bắt đầu bằng Thân:, và máy tự chạy hết khung rồi quay lại. Node cuối trong khung cứ để trống — đó chính là cách kết thúc một lượt. Tuyệt đối không kéo dây từ trong khung ra ngoài. Hết lượt, kịch bản đi tiếp theo đầu ra Tiếp.
| Node lặp | Dùng khi | Điền gì |
|---|---|---|
| Lặp N lần (Repeat N times) | Bạn biết trước số lượt: cuộn năm lần, đăng ba bài. | Số lần lặp, và nếu cần thì Biến đếm giữ số thứ tự lượt, "đếm từ 0". |
| Lặp theo danh sách (Repeat over a list) | Bạn có một danh sách và muốn mỗi phần tử một lượt — hai mươi bình luận, mỗi lượt một cái. | Danh sách nguồn ("Chọn một biến kiểu danh sách văn bản để duyệt"), Biến phần tử giữ phần tử lượt này, và nếu cần thì Biến vị trí giữ vị trí của nó, cũng đếm từ 0. |
| Lặp khi còn đúng (While) | Bạn không biết trước số lượt: cứ làm chừng nào điều kiện còn đúng. | Điều kiện, cộng thêm Giới hạn số vòng — "Chặn cứng, để điều kiện không bao giờ sai vẫn dừng được". |
Lặp khi còn đúng còn một cạnh sắc nữa: "Điều kiện được kiểm TRƯỚC mỗi lượt — sai ngay từ đầu thì thân không chạy lượt nào." Nếu thấy mấy node trong thân hình như chẳng chạy gì, kiểm lại xem điều kiện có bao giờ đúng không đã.
Muốn ra sớm thì đặt Dừng / bỏ qua vòng lặp (Break / skip loop) vào trong khung: "Thoát hẳn là ra khỏi vòng lặp, Bỏ qua là sang lượt kế." Thoát hẳn là "tìm thấy rồi, khỏi tìm nữa". Bỏ qua là "cái này hỏng, sang cái kế".
Vòng lặp không có lối ra là nguyên nhân số một làm lượt chạy chết. Lượt chạy còn chạy sau 30 phút sẽ bị cắt và ghi là Thất bại, lý do TIMEOUT. Hai thủ phạm quen mặt: một node Lặp khi còn đúng mà điều kiện không bao giờ sai được, và một vòng lặp đang chờ màn hình không bao giờ hiện. Hãy đặt Giới hạn số vòng, và cho vòng lặp một node Dừng / bỏ qua vòng lặp.
Chờ cái máy, thay vì chờ cái đồng hồ
Hai node chờ một chuyện có thật xảy ra.
Chờ một trong nhiều màn hình (Wait for any screen), trong thư viện nằm ở nhóm Element (ELEMENTS), dành cho khúc mà app có thể đi nhiều đường — vào thẳng, hoặc hiện captcha, hoặc bắt "xác minh email". Bạn khai ra các màn hình, đặt tên từng nhánh, rồi kịch bản đi theo cái nào hiện ra trước. Các màn hình được "Kiểm tra theo thứ tự từ trên xuống, khớp màn hình nào thì đi nhánh đó. Xếp màn hình đặc trưng hơn lên trước". Mỗi Tên nhánh sẽ "Hiện trên dây nối ở canvas", nên đặt tên theo màn hình chứ đừng đặt TH 1. Không màn hình nào kịp hiện thì đi nhánh Hết giờ — đây là đầu ra khác với error, nhờ vậy "chẳng thấy gì cả" không bị coi là sự cố.
Chờ có mạng (Wait for network), trong thư viện nằm ở nhóm Thiết bị (DEVICE), hỏi xem máy có thật sự ra được internet không: "“Có internet” là kiểm tra thật sự ra được ngoài, không chỉ có sóng". Có mạng thì đi nhánh Đúng ngay; chưa có thì chờ tới hết giờ rồi rẽ Sai. Đặt thời gian chờ bằng 0 "để kiểm một lần ngay, không chờ" khi bạn chỉ muốn biết ngay lúc này.

Đầu ra để trống thì chuyện gì xảy ra
Chỗ này bẫy đủ nhiều người để đáng nói thẳng:
- out, true, false, case, timeout để trống: "flow kết thúc thành công tại đó."
- error để trống: "flow dừng và báo lỗi." Muốn đi tiếp sau khi lỗi thì bắt buộc phải nối đầu ra error đi đâu đó.
- Trong thân vòng lặp, đầu ra để trống là hết một lượt — nhưng error vẫn dừng cả kịch bản.
Tóm tắt
- Bắt đầu mở màn lượt chạy; Dừng kịch bản kết thúc kèm lý do — mã kết quả, lời nhắn, và ảnh màn hình nếu cần. Còn bỏ trống một đầu ra thì kịch bản vốn đã kết thúc thành công rồi.
- Cho Chờ hai đầu lệch nhau để cả dàn máy không cử động cùng nhịp, và ưu tiên chờ element hơn chờ đồng hồ.
- Ghi log có nhét
{{biến}}vào nội dung là cách gỡ lỗi rẻ nhất bạn từng dùng. - Ở node Nếu, muốn đọc biến ở vế phải thì phải bọc
{{ }}, và so số thì đổi So sánh kiểu sang Số. - Vòng lặp là hộp chứa: nối Thân vòng lặp vào trong, không bao giờ kéo dây ngược ra. Cho Lặp khi còn đúng một giới hạn số vòng và một node thoát, không thì cái TIMEOUT 30 phút đang chờ sẵn.