Cách xử lý Handle AJAX Call trong Selenium Webdriver

Ajax là gì?

AJAX là viết tắt của Asynchronous 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à động. Kỹ thuật này không đồng bộ và sử dụng kết hợp giữa Javascript và XML.

Nó sẽ cập nhật / các phần của một 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.

  • Lệnh gọi Ajax là một yêu cầu không đồng bộ do trình duyệt khởi tạo không trực tiếp dẫn đến chuyển đổi trang. Có nghĩa là, nếu bạn kích hoạt mộ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 cho bạn phản hồi .

Theo quan điểm của người kiểm tra, nếu bạn đang kiểm tra nội dung hoặc yếu tố được hiển thị, bạn cần phải đợ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 bằng Selenium Webdriver

Các thách thức lớn nhất trong việc xử lý cuộc gọi Ajax là biết thời gian tải cho 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 thử nghiệm rất khó để kiểm tra ứng dụng đó thông qua công cụ tự động hóa. Để làm được điều đó, Selenium Webdriver phải sử dụng phương thức chờ trên Cuộc 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 Trường hợp thử nghiệm hiện tại và đợi giá trị dự kiến ​​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ờ mà Selenium Webdriver có thể sử dụng

  1. Thread.Sleep ()
  • Thread.Sleep () không phải là một lựa chọn khôn ngoan vì nó sẽ tạm ngưng luồng hiện tại trong một 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, thử nghiệm của bạn sẽ không thành công nếu phần tử không hiển thị trong thời gian chờ đợi. 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.
  • 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 khoảng thời gian để được CPU chọn và chạy.
  1. Implicit Wait()
  • Phương thức này yêu cầu webdriver đợi nếu phần tử không khả dụng ngay lập tức, nhưng quá trình chờ này sẽ diễn ra trong toàn bộ thời gian trình duyệt mở. Vì vậy, bất kỳ tìm kiếm nào cho các phần tử trên trang có thể mất thời gian chờ đợi ngầm định.
  1. Explicit Wait()
  • Chờ đợi rõ ràng được sử dụng để đóng băng việc thực thi thử nghiệm cho đến khi một điều kiện cụ thể được đáp ứng hoặc thời gian trôi đi tối đa.
  1. WebdriverWait
  • 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 với WebDriverWait kết hợp với Điều kiện mong đợi
  • Cách tốt nhất để đợi 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 đề của tất cả những lần chờ đợi này là bạn phải đề cập đến đơn vị thời gian chờ. Điều gì sẽ xảy ra nếu phần tử vẫn không có mặt trong thời gian đó? Vì vậy, có một sự chờ đợi nữa được gọi là Chờ đợi thông thạo.

  1. Fluent Wait
  • Đây là một thực hiện của giao diện Chờ có thời gian chờ và  khoảng kiểm tra vòng. Mỗi cá thể 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ý cuộc gọi Ajax trong Selenium Webdriver

  • Sử dụng lệnh “pause” để xử lý cuộc 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 không thể chấp nhận được và làm tăng thời gian kiểm tra . 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ể
  • Được nhà phát triển trao toàn quyền tự do 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 như vậy 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ụ cho việc XỬ LÝ Ajax

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 = “http://demo.guru99.com/test/ajax.html”;

WebDriver driver;

WebDriverWait wait;

@BeforeClass

public void setUp() {

System.setProperty(“webdriver.chrome.driver”,”.\\chromedriver.exe”);

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();

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óm tắt:

  • AJAX cho phép trang Web lấy 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
    • ThreadSleep
    • Implicit Wait
    • Explicit Wait
    • WebdriverWait
    • Fluent Wait
  • 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 như vậy 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.
Back to top button