Cách xử lý cuộc gọi AJAX trong Selenium webdriver
⚡ Tóm tắt thông minh
Các lệnh gọi AJAX cập nhật một phần của trang mà không cần tải lại trang, vì vậy Selenium WebDriver phải chờ nội dung mới thay vì giả định rằng nó đã có sẵn, và chiến lược chờ đợi sẽ quyết định liệu bài kiểm tra có thành công một cách đáng tin cậy hay không.
AJAX là gì?
AJAX là viết tắt của Asynchronous JavaNó sử dụng Script & XML và cho phép trang web truy xuất một lượng nhỏ dữ liệu từ máy chủ mà không cần tải lại toàn bộ trang.
AJAX là một kỹ thuật để xây dựng các trang web động, nhanh chóng. Nó hoạt động bất đồng bộ, kết hợp... JavaScript Với định dạng dữ liệu cụ thể, nó cập nhật một phần trang thay vì toàn bộ trang. Gmail, Google Bản đồ, Facebook và YouTube Tất cả đều sử dụng nó.
AJAX hoạt động như thế nào?
Ví dụ, khi bạn nhấn nút gửi, JavaĐoạn mã sẽ gửi yêu cầu đến máy chủ, diễn giải kết quả và cập nhật màn hình hiện tại mà không cần tải lại trang. Sơ đồ bên dưới minh họa quá trình này.
- Cuộc gọi AJAX là một yêu cầu bất đồng bộ từ trình duyệt mà không gây ra sự chuyển đổi trang. Người dùng có thể tiếp tục làm việc trên ứng dụng trong khi chờ phản hồi từ yêu cầu.
- AJAX gửi các yêu cầu HTTP đến máy chủ và xử lý phản hồi mà không cần tải lại trang, vì vậy bạn không thể dự đoán được máy chủ sẽ mất bao lâu để trả lời.
Từ góc nhìn của người kiểm thử, việc kiểm tra nội dung hoặc một phần tử có nghĩa là phải chờ cho đến khi nhận được phản hồi. Ban đầu, dữ liệu trả về là XML, như tên gọi đã phản ánh; hầu hết các API hiện nay đều trả về JSON.
Cách xử lý cuộc gọi AJAX trong Selenium webdriver
Thách thức lớn nhất khi xử lý cuộc gọi AJAX là việc xác định thời gian tải. Vì quá trình cập nhật chỉ diễn ra trong một phần nhỏ của giây, nên việc kiểm thử ứng dụng thông qua công cụ tự động hóa rất khó khăn. Selenium WebDriver phải áp dụng phương thức chờ cho lệnh gọi.
Việc thực thi lệnh chờ đó sẽ tạm dừng tiến trình hiện tại. Trường hợp thử nghiệm cho đến khi giá trị mong đợi hoặc giá trị mới xuất hiện; Selenium WebDriver sau đó sẽ tiếp tục các bước đã bị tạm dừng.
Sau đây là các phương pháp chờ đợi Selenium WebDriver có thể sử dụng
Thread.sleep ()
- Việc sử dụng Thread.sleep() không phải là lựa chọn khôn ngoan vì nó tạm dừng luồng hiện tại trong khoảng thời gian được chỉ định.
- Trong AJAX, bạn không bao giờ có thể chắc chắn về thời gian chờ chính xác, vì vậy phép thử sẽ thất bại nếu phần tử không xuất hiện trong khoảng thời gian đó. Điều này cũng làm tăng thêm chi phí, bởi vì Thread.sleep(t) chuyển luồng hiện tại từ hàng đợi đang chạy sang hàng đợi đang chờ.
- Sau thời gian 't', luồng được chuyển đến hàng đợi sẵn sàng, và sau đó lại chờ để được CPU xử lý.
Lưu ý: các Java phương pháp là Thread.sleep () Viết thường; dạng viết hoa không biên dịch được.
Chờ ngầm()
- Phương pháp này yêu cầu WebDriver chờ khi một phần tử không có sẵn ngay lập tức, và thiết lập này sẽ được duy trì trong suốt phiên duyệt web. Do đó, mỗi lần tìm kiếm phần tử có thể mất thời gian tùy thuộc vào thời gian chờ ngầm định.
Chờ rõ ràng()
- chờ đợi rõ ràng được sử dụng để đóng băng quá trình thực hiện kiểm thử cho đến khi đáp ứng được một điều kiện cụ thể hoặc thời gian trôi qua tối đa.
WebDriverĐợi
- Nó có thể được sử dụng cho bất kỳ điều kiện nào, bằng cách kết hợp WebDriverWait với ExpectedCondition.
- Cách tốt nhất là kiểm tra điều kiện mỗi giây và chuyển sang lệnh tiếp theo ngay khi điều kiện được đáp ứng.
Nhưng vấn đề với tất cả những sự chờ đợi này là bạn phải đề cập đến đơn vị hết thời gian chờ. Điều gì sẽ xảy ra nếu phần tử vẫn không xuất hiện trong thời gian đó? Vì vậy, có thêm một sự chờ đợi được gọi là chờ đợi trôi chảy.
Chờ trôi chảy
- Đây là một triển khai của giao diện Wait với thời gian chờ và khoảng thời gian thăm dò riêng. Mỗi thể hiện của FluentWait thiết lập thời gian tối đa để chờ một điều kiện và tần suất kiểm tra điều kiện đó.
Những thách thức trong việc xử lý cuộc gọi AJAX trong Selenium webdriver
- Việc sử dụng lệnh “tạm dừng” không đáng tin cậy. Tạm dừng quá lâu sẽ làm cho quá trình kiểm tra diễn ra chậm một cách không thể chấp nhận được và làm tăng nguy cơ xảy ra lỗi. Kiểm tra Vì vậy, thay vào đó, "waitforcondition" được khuyến nghị sử dụng cho các ứng dụng AJAX.
- Rất khó để đánh giá rủi ro liên quan đến các ứng dụng AJAX cụ thể.
- Việc cho phép các nhà phát triển toàn quyền chỉnh sửa ứng dụng AJAX khiến quá trình kiểm thử trở nên khó khăn hơn.
- Việc tạo yêu cầu kiểm thử tự động có thể khó khăn đối với các công cụ kiểm thử, bởi vì các ứng dụng AJAX thường sử dụng kỹ thuật mã hóa hoặc tuần tự hóa khác nhau để gửi dữ liệu POST.
Lưu ý: “tạm dừng” và “chờ điều kiện” là người Selenese các lệnh đã bị xóa trong Selenium 3; phương pháp tương đương trong WebDriver là chờ đợi một cách rõ ràng.
Code Ví dụ về cách xử lý AJAX bằng cách sử dụng Selenium webdriver
TestNG Lớp bên dưới đọc văn bản, nhấp vào nút radio, chờ phản hồi AJAX và xác nhận rằng văn bản đã thay đổi.
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class Ajaxdemo { private String URL = "https://demo.guru99.com/test/ajax.html"; WebDriver driver; WebDriverWait wait; @BeforeClass public void setUp() { System.setProperty("webdriver.chrome.driver",".\\chromedriver.exe"); //create chrome instance driver = new ChromeDriver(); driver.manage().window().maximize(); driver.navigate().to(URL); } @Test public void test_AjaxExample() { By container = By.cssSelector(".container"); wait = new WebDriverWait(driver, 5); wait.until(ExpectedConditions.presenceOfElementLocated(container)); //Get the text before performing an ajax call WebElement noTextElement = driver.findElement(By.className("radiobutton")); String textBefore = noTextElement.getText().trim(); //Click on the radio button driver.findElement(By.id("yes")).click(); //Click on Check Button driver.findElement(By.id("buttoncheck")).click(); /*Get the text after ajax call*/ WebElement TextElement = driver.findElement(By.className("radiobutton")); wait.until(ExpectedConditions.visibilityOf(TextElement)); String textAfter = TextElement.getText().trim(); /*Verify both texts before ajax call and after ajax call text.*/ Assert.assertNotEquals(textBefore, textAfter); System.out.println("Ajax Call Performed"); String expectedText = "Radio button is checked and it's value is Yes"; /*Verify expected text with text updated after ajax call*/ Assert.assertEquals(textAfter, expectedText); driver.close(); } }
Lưu ý: on Selenium 4 qua Thời lượng.giây(5) Hãy sử dụng WebDriverWait và bỏ dòng System.setProperty đi, vì Selenium Quản lý giải quyết vấn đề chromedriver.

