Quá trình QA do AI điều khiển trên một công cụ thiết kế dựa trên web đã báo cáo “Tất cả các tính năng đang hoạt động, đạt (pass)”, thế nhưng canvas lại không hiển thị gì cả. Lỗi "pass giả" này không phải là một lỗi trong lập luận của mô hình; đó là hệ quả của cách trình duyệt xử lý các tab ẩn và cách kịch bản kiểm thử đo lường "sức khỏe" (health) thay vì đầu ra hình ảnh.

Tại sao các agent QA bằng AI có thể bỏ lỡ một canvas trống

Chúng thực thi JavaScript, chụp ảnh màn hình và để mô hình suy luận xem một tính năng có hoạt động chính xác hay không. Trong thực tế, có hai điểm mù kỹ thuật thường xuyên tạo ra kết quả "pass" trong khi giao diện người dùng (UI) thực tế lại trống rỗng.

Giải thích về việc tiết chế (throttling) tab ẩn

Chrome MCP thường chạy các bài kiểm tra trong các tab nền để giữ cho cửa sổ chính trống cho các công việc khác. Khi document.visibilityState của một tab ở trạng thái hidden (ẩn), trình duyệt sẽ tiết chế (throttle) quy trình kết xuất (rendering pipeline):

  • JavaScript vẫn tiếp tục chạy, vì vậy không có lỗi runtime nào xuất hiện.
  • Các callback của requestAnimationFrame ngừng kích hoạt, khiến số lượng khung hình hoạt ảnh dừng ở mức không.
  • Các bộ hẹn giờ (timers) kích hoạt ít thường xuyên hơn nhiều; một bài kiểm tra mong đợi các khoảng thời gian 33 ms chỉ quan sát được bốn lần.

Agent AI thấy kết quả JS sạch sẽ và một ảnh chụp màn hình, rồi giả định rằng hoạt ảnh đã hoạt động. Vì vòng lặp kết xuất không bao giờ tạo ra pixel, lỗi hiển thị vẫn bị che khuất.

Cách khắc phục các vấn đề liên quan đến tab ẩn

  • Giữ tab kiểm thử ở trạng thái hiển thị đối với bất kỳ việc xác minh canvas, hoạt ảnh hoặc đồ họa nào.
  • Chỉ kích hoạt các tương tác sau khi tab đã ở tiền cảnh (foreground).
  • Chèn một khoảng chờ ngắn (vài giây) trước khi chụp ảnh màn hình để đảm bảo bộ đệm khung hình (frame buffer) đã được lấp đầy.
  • Nếu bắt buộc phải sử dụng tab ẩn, hãy thêm một tuyên bố miễn trừ trách nhiệm vào đầu báo cáo, chẳng hạn như “không quan sát được kết xuất về mặt hình ảnh”.

Sức khỏe mã nguồn (code health) so với hành vi tính năng

Hầu hết các kịch bản QA bằng AI đều đánh giá “sức khỏe mã nguồn”: chúng xác nhận rằng các trình xử lý sự kiện click đã được kết nối, không có ngoại lệ JavaScript nào được ném ra và các thư viện cần thiết đã được tải. Những tín hiệu đó chứng minh rằng mã đã chạy, chứ không phải UI đã thay đổi như ý muốn. Một phần tử canvas có thể được tạo ra, một quy trình vẽ được gọi, nhưng vẫn không kết xuất ra gì nếu các lệnh vẽ nhắm vào một bộ đệm có kích thước bằng không hoặc một tài nguyên (asset) trống.

Sự phân biệt này rất quan trọng vì một luồng mã "khỏe mạnh" có thể che giấu một lỗi hiển thị bị thiếu.

Thêm các kiểm tra hành vi

  1. Xác định các phần tử động – Quét mã nguồn để tìm các thẻ canvas, trường file-input, nút tải xuống và các vòng lặp hoạt ảnh.
  2. Xác định các kết quả có thể quan sát được – Đối với canvas, yêu cầu kiểm tra ở cấp độ pixel để đảm bảo bitmap không trống. Đối với file input, xác minh rằng hình ảnh xem trước xuất hiện. Đối với việc tải xuống, xác nhận rằng một tệp được tạo trên hệ thống tệp. Đối với hoạt ảnh, khẳng định rằng một thuộc tính được theo dõi thay đổi theo thời gian.
  3. Báo cáo phạm vi bao phủ – Đính kèm một bảng vào kết quả QA liệt kê từng tính năng, trạng thái sức khỏe mã nguồn và kết quả xác minh hành vi. Bất cứ thứ gì thiếu kiểm tra hành vi sẽ được giữ ở trạng thái “chưa xác minh” (unverified) thay vì “đạt” (pass).

Việc áp dụng quy tắc này đã giảm đáng kể các trường hợp dương tính giả (false positives) trong bộ kiểm thử của tác giả, đồng thời cũng phát hiện ra các lỗi không khớp CSS khi bảng kiểu (stylesheet) khai báo một màu nhưng pixel được kết xuất lại khác.

Các bước thực tế để kiểm thử hình ảnh đáng tin cậy

  • Chạy kiểm thử trong một tab hiển thị bất cứ khi nào tính năng liên quan đến việc kết xuất.
  • Đợi UI ổn định; một khoảng trễ cố định vài giây thường là đủ, nhưng một cách tiếp cận mạnh mẽ hơn là thăm dò (poll) để tìm một canvas không trống bằng cách sử dụng getImageData.
  • Tách biệt các khẳng định về sức khỏe mã nguồn khỏi các khẳng định về hình ảnh trong kịch bản kiểm thử; hãy để mô hình AI đánh giá từng loại một cách độc lập.
  • Ghi lại trạng thái hiển thị và bộ đếm khung hình (các lệnh gọi requestAnimationFrame) như một phần của đầu ra chẩn đoán.
  • Tài liệu hóa bất kỳ lần chạy tab ẩn không thể tránh khỏi nào với các cảnh báo rõ ràng để những người đánh giá sau đó hiểu được giới hạn.

Những điều cần lưu ý tiếp theo

Khi các công cụ QA hỗ trợ bởi AI ngày càng phổ biến, các nhà phát triển phải coi chúng là trợ lý, chứ không phải là trọng tài. Các chỉ số về sức khỏe mã nguồn sẽ luôn là một đại diện không đầy đủ cho hành vi hướng tới người dùng. Bài học rút ra rất đơn giản: một mô hình AI chỉ có thể báo cáo những gì nó thấy. Nếu trình duyệt không bao giờ vẽ (paint) vì tab bị ẩn, hoặc nếu kịch bản kiểm thử không bao giờ hỏi “có thứ gì xuất hiện trên màn hình không?”, mô hình sẽ vui vẻ tuyên bố thành công. Việc thêm yêu cầu về hiển thị và bước xác minh hành vi sẽ biến một kết quả "pass" bóng bẩy thành một kết quả đáng tin cậy.