Đợi đối tượng UI hoặc sự kiện với Selenium WebDriver

Trong bài này, mình sẽ sử dụng mã Selenium WebDriver cho C#

Trong kiểm thử tự động, đôi khi tốc độ của công cụ kiểm thử tự động nhanh hơn tốc độ của ứng dụng cần kiểm thử (AUT/SUT) dẫn đến việc thực thi kiểm thử của chúng ta thất bại (Failed). Hầu hết các công cụ kiểm thử tự động đều hỗ trợ cho chúng ta cách để có thể chờ đợi một đối tượng UI hoặc một sự kiện của đối tượng UI xảy ra. Selenium WebDriver cung cấp cho chúng ta hai phương thức để làm việc này: Explicit (công khai) và Implicit (ngầm).

Chờ đợi Implicit

Chờ ngầm là việc sử dụng một thời gian nhất định để Selenium WebDriver cố gắng tìm một đối tượng UI trong trường hợp đối tượng UI không xuất hiện ngay lập tức. Giá trị mặc định là 0 giây, và giá trị này được gắn kèm với đối tượng IWebDriver. Một khi được thiết lập, giá trị này sẽ bắt đầu ảnh hưởng đến toàn bộ vòng đời của đối tượng IWebDriver, cho đến khi được thiết lập giá trị mới hoặc kết thúc đối tượng IWebDriver. Sau khi thiết lập giá trị này, trong các đoạn mã kiểm thử, chúng ta không cần phải thêm bất kỳ câu lệnh nào nữa. Việc chờ đợi được đối tượng IWebDriver quản lý. Đây cũng là lý do mà chúng ta gọi là chờ “ngầm” :).

Cách thiết lập cho việc chờ này như sau:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

Đối số của hàm ImplicitlyWait là một đối tượng TimeSpan của C#, và chúng ta hoàn toàn toàn quyền thiết lập giá trị tối đa cho việc chờ đợi trước khi trả về lỗi Không-Tìm-Thấy-Đối-Tượng.

Chờ đợi Explicit

Chờ đợi công khai là một phương thức chèn mã ngay trong kịch bản kiểm thử tự động của chúng ta, đặc biệt để đợi một sự kiện của đối tượng UI. Đối với việc chờ ngầm, chúng ta chỉ đợi một sự kiện là đối tượng UI xuất hiện trên trang, hay đúng hơn là trong mã nguồn HTML của trang web. Sử dụng phương thức công khai, chúng ta có thể chờ đợi những sự kiện đặc biệt khác của đối tượng UI, như hiển thị, sẵn sàng để sử dụng, thay đổi kích thước, vị trí, v.v… Chúng ta đặc biệt sử dụng cách này khi tương tác với các đối tượng UI Ajax, vì những đối tượng này thường thay đổi trạng thái khi máy chủ/máy khách hoạt động.

Với cách này, chúng ta cần một đối tượng trong Selenium WebDriver để quản lý thời gian chờ đợi, WebDriverWait. Cách viết mã cho việc này như sau:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementToBeClickable([IWebElement]));

Đối tượng ExpectedConditions

Để việc sử dụng phương thức chờ đợi công khai này dễ dàng hơn, Selenium WebDriver hỗ trợ chúng ta đối tượng ExpectedConditions, dùng cho việc khai báo các điều kiện chờ đợi trong từng trường hợp cụ thể.

Các điều kiện chờ thường sử dụng:

  • ElementExists: đợi một đối tượng UI tồn tại trong mã HTML của trang web
  • ElementIsVisible: đợi một đối tượng UI hiển thị trên trang
  • ElementToBeClickable: đợi một đối tượng UI sẵn sàng được tương tác
  • TextToBePresentInElement: đợi một đối tượng UI với một đoạn chữ mong muốn
  • FrameToBeAvailableAndSwitchToIt: đợi một đối tượng Frame sẵn sàng tương tác

Kiểm thử tự động