Cách xử lý cuộc gọi AJAX trong Selenium webdriver
Ajax là gì?
AJAX là viết tắt của không đồng bộ JavaScript & XML, và nó 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 được sử dụng để tạo các trang web nhanh và năng động. Kỹ thuật này không đồng bộ và sử dụng kết hợp Javascript và XML. Nó sẽ cập nhật một phần/các phần của trang web mà không cần tải lại toàn bộ trang. Một số ứng dụng nổi tiếng sử dụng kỹ thuật AJAX là Gmail, Google Maps, Facebook, Youtube, v.v.
Ajax hoạt động như thế nào?
Ví dụ: khi bạn nhấp vào nút gửi, JavaScript sẽ đưa ra yêu cầu tới 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 web.
- Cuộc gọi Ajax là yêu cầu không đồng bộ được khởi tạo bởi trình duyệt mà không trực tiếp dẫn đến chuyển đổi trang. Điều đó có nghĩa là nếu bạn kích hoạt yêu cầu Ajax, người dùng vẫn có thể làm việc trên ứng dụng trong khi yêu cầu đang chờ phản hồi.
- AJAX gửi các yêu cầu HTTP từ máy khách đến máy chủ và sau đó xử lý phản hồi của máy chủ mà không cần tải lại toàn bộ trang. Vì vậy, khi bạn thực hiện cuộc gọi AJAX, bạn không chắc chắn về thời gian máy chủ gửi phản hồi cho bạn.
Theo quan điểm của người thử nghiệm, nếu bạn đang kiểm tra nội dung hoặc thành phần sẽ được hiển thị, bạn cần đợi cho đến khi nhận được phản hồi. Trong cuộc gọi AJAX, dữ liệu được lưu trữ ở định dạng XML và được truy xuất từ máy chủ.
Cách xử lý cuộc gọi Ajax trong Selenium webdriver
Thách thức lớn nhất trong việc xử lý lệnh gọi Ajax là biết thời gian tải trang web. Vì quá trình tải trang web sẽ chỉ kéo dài trong một phần giây nên người kiểm tra khó có thể kiểm tra ứng dụng đó thông qua công cụ tự động hóa. Vì điều đó, Selenium Webdriver phải sử dụng phương thức chờ trong Lệnh gọi Ajax này.
Vì vậy, bằng cách thực hiện lệnh chờ này, selen sẽ tạm dừng việc thực thi dòng điện Trường hợp thử nghiệm và chờ đợi giá trị mong đợi hoặc giá trị mới. Khi giá trị hoặc trường mới xuất hiện, các trường hợp thử nghiệm bị treo sẽ được thực thi bởi Selenium Webdriver.
Sau đây là các phương pháp chờ đợi Selenium Webdriver có thể sử dụng
Chủ đề.Sleep()
- 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 đã 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, thử nghiệm của bạn sẽ thất bại nếu phần tử không hiển thị trong thời gian chờ. Hơn nữa, nó làm tăng chi phí vì việc gọi Thread.sleep(t) làm cho luồng hiện tại được chuyển từ hàng đợi đang chạy sang hàng đợi chờ.
- Sau khi đạt đến thời gian 't', luồng hiện tại sẽ chuyển từ hàng đợi sang hàng đợi sẵn sàng và sau đó phải mất một thời gian để CPU chọn và chạy.
Chờ ngầm()
- Phương pháp này yêu cầu quản trị viên web đợi nếu phần tử không có sẵn ngay lập tức, nhưng việc chờ đợi này sẽ được áp dụng trong suốt thời gian trình duyệt mở. Vì vậy, bất kỳ tìm kiếm nào cho các thành phần trên trang đều có thể mất 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.
Trình điều khiển webĐợi
- Nó có thể được sử dụng cho bất kỳ điều kiện nào. Điều này có thể đạt được bằng WebDriverWait kết hợp với ExpectedCondition
- Cách tốt nhất để chờ một phần tử động là kiểm tra điều kiện mỗi giây và tiếp tục lệnh tiếp theo trong tập lệnh 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à cách triển khai giao diện Chờ có thời gian chờ và khoảng thời gian bỏ phiếu. Mỗi phiên bản FluentWait xác định lượng thời gian tối đa để chờ một điều kiện cũng như tần suất kiểm tra điều kiện đó.
Những thách thức trong việc xử lý lệnh gọi Ajax Selenium webdriver
- Việc sử dụng lệnh “tạm dừng” để xử lý lệnh gọi Ajax không hoàn toàn đáng tin cậy. Thời gian tạm dừng dài làm cho bài kiểm tra chậm đến mức không thể chấp nhận được và làm tăng Kiểm tra thời gian. Thay vào đó, “waitforcondition” sẽ hữu ích hơn trong việc thử nghiệm 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ể
- Trao toàn quyền cho các nhà phát triển sửa đổi ứng dụng Ajax khiến quá trình thử nghiệm trở nên khó khăn
- Việc tạo yêu cầu kiểm tra tự động có thể khó khăn đối với các công cụ kiểm tra vì ứ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.
Ví dụ về mã cho việc XỬ LÝ Ajax bằng cách sử dụng Selenium webdriver
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(); } }
Tổng kết
- AJAX 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.
- Để kiểm tra ứng dụng Ajax, nên áp dụng các phương pháp chờ khác nhau
- Chủ đềNgủ
- Chờ đợi ngầm
- Chờ đợi rõ ràng
- Trình điều khiển webĐợi
- Chờ trôi chảy
- Việc tạo yêu cầu kiểm tra tự động có thể khó khăn đối với các công cụ kiểm tra vì ứ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.