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.

  • 🔘 Định nghĩa: AJAX tải một lượng nhỏ dữ liệu không đồng bộ và chỉ làm mới một phần của trang.
  • ☑️ Vấn đề cốt lõi: Thời gian phản hồi của máy chủ không xác định, do đó phần tử có thể không tồn tại khi WebDriver tìm kiếm.
  • Các tùy chọn chờ đợi: Thread.sleep, implicit wait, explicit wait, WebDriverWait và FluentWait đều hoạt động khác nhau.
  • 🧪 Đề nghị: WebDriverWait với ExpectedCondition sẽ kiểm tra liên tục cho đến khi kết quả AJAX xuất hiện, sau đó tiếp tục ngay lập tức.
  • 🛠️ FluentWait: Nó bổ sung thêm khoảng thời gian thăm dò và có thể bỏ qua các ngoại lệ đã chọn giữa các lần thử.
  • ⚠️ Selenium 4: Thời gian chờ giờ đây có thể sử dụng Duration, và Selenium Quản lý loại bỏ đường dẫn lái xe thủ công.

Cách xử lý các cuộc gọi AJAX trong Selenium webdriver

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.

Sơ đồ minh họa cuộc gọi AJAX giữa trình duyệt và máy chủ mà không cần tải lại toàn bộ trang.

  • 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.

Câu Hỏi Thường Gặp

Không. Các hàm tạo int và long đã bị xóa. Thay vào đó, hãy truyền Duration.ofSeconds(5) và sử dụng Duration cho implicitlyWait, pageLoadTimeout và mọi thiết lập FluentWait.

Hãy sử dụng ExpectedConditions.invisibilityOfElementLocated với bộ định vị spinner. Việc chỉ chờ đợi phần tử mục tiêu thường diễn ra quá sớm, trong khi lớp phủ vẫn chặn cú nhấp chuột.

Thực thi đoạn mã trả về `jQuery.active == 0` bên trong khối `wait until`. Nó chỉ trả về giá trị 0 khi không còn yêu cầu jQuery nào đang mở.

Phản hồi AJAX đã thay thế nút DOM mà WebElement của bạn trỏ đến. Hãy tìm lại phần tử đó sau khi chờ đợi thay vì sử dụng lại tham chiếu trước đó.

Các mô hình AI học thời gian phản hồi điển hình để điều chỉnh thời gian chờ cho mỗi phần tử, gắn cờ các lỗi không thường xuyên thay vì lỗi thực sự, và nhóm chúng lại để chỉ cần khắc phục một nguyên nhân gốc rễ duy nhất.

Vâng. Trợ lý GitHub Soạn thảo các khối WebDriverWait và FluentWait từ một bình luận, nhưng xác nhận rằng ExpectedCondition khớp với hành vi thực tế của trang.

STT Selenium Tài liệu cảnh báo rằng việc trộn lẫn chúng sẽ gây ra lỗi hết thời gian chờ không thể đoán trước. Hãy giữ thời gian chờ ngầm định ở mức 0 và chỉ dựa vào thời gian chờ tường minh.

Không phải vì Selenium 4.6. Selenium Trình quản lý tải xuống và cấu hình trình điều khiển phù hợp, vì vậy dòng lệnh này chỉ cần thiết để ghim một tệp nhị phân trình điều khiển cục bộ.

Tóm tắt bài viết này với: