AJAX 호출을 처리하는 방법 Selenium 웹드라이버

아약스란?

AJAX는 다음을 의미합니다. 비동기 Java스크립트 및 XML, 그리고 이를 통해 웹 페이지는 전체 페이지를 다시 로드하지 않고도 서버에서 소량의 데이터를 검색할 수 있습니다.

Ajax는 빠르고 동적인 웹 페이지를 만드는 데 사용되는 기술입니다. 이 기술은 비동기적이며 다음의 조합을 사용합니다. Javascript 그리고 XML. 전체 페이지를 다시 로드하지 않고 웹 페이지의 일부를 업데이트합니다. AJAX 기술을 사용하는 유명한 애플리케이션으로는 Gmail, Google Maps, Facebook, Youtube 등이 있습니다.

Ajax는 어떻게 작동하나요?

예를 들어 제출 버튼을 클릭하면 Java스크립트 서버에 요청하고 결과를 해석한 후 웹페이지를 다시 로드하지 않고 현재 화면을 업데이트합니다.

Ajax 작동 방식

  • Ajax 호출은 브라우저에서 시작된 비동기 요청으로, 페이지 전환으로 직접 이어지지 않습니다. 즉, Ajax 요청을 실행하면 사용자는 요청이 응답을 기다리는 동안에도 애플리케이션에서 작업할 수 있습니다.
  • AJAX는 전체 페이지를 다시 로드하지 않고 클라이언트에서 서버로 HTTP 요청을 보낸 다음 서버의 응답을 처리합니다. 따라서 AJAX 호출을 하면 서버가 응답을 보내는 데 걸리는 시간을 잘 모르겠습니다.

테스터의 관점에서, 표시할 콘텐츠나 요소를 확인하는 경우 응답을 받을 때까지 기다려야 합니다. AJAX 호출 중에 데이터는 XML 형식으로 저장되고 서버에서 검색됩니다.

Ajax 호출을 처리하는 방법 Selenium 웹드라이버

이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 Ajax 호출을 처리하는 데 있어 가장 큰 과제는 웹 페이지 로딩 시간을 아는 것입니다. 웹 페이지 로딩은 몇 초 동안만 지속되므로 테스터가 자동화 도구를 통해 이러한 애플리케이션을 테스트하기는 어렵습니다. 그에 대한, Selenium Webdriver는 이 Ajax 호출에서 wait 메소드를 사용해야 합니다.

따라서 이 대기 명령을 실행하면 Selenium은 현재 실행을 일시 중단합니다. 테스트 케이스 예상되거나 새로운 값을 기다립니다. 새 값이나 필드가 나타나면 일시 중지된 테스트 사례가 실행됩니다. Selenium 웹드라이버.

다음은 대기 방법입니다. Selenium 웹드라이버가 사용할 수 있는

스레드.수면()

  • Thread.Sleep()은 지정된 시간 동안 현재 스레드를 중단하므로 현명한 선택이 아닙니다.
  • AJAX에서는 정확한 대기 시간을 확신할 수 없습니다. 따라서 요소가 대기 시간 내에 표시되지 않으면 테스트가 실패합니다. 게다가 Thread.sleep(t)을 호출하면 현재 스레드가 실행 중인 큐에서 대기 중인 큐로 이동되기 때문에 오버헤드가 증가합니다.
  • 't' 시간에 도달한 후 현재 스레드는 대기 큐에서 준비 큐로 이동한 후 CPU에서 선택되어 실행되는 데 약간의 시간이 걸립니다.

암시적 대기()

  • 이 메소드는 요소를 즉시 사용할 수 없는 경우 웹드라이버에게 기다리라고 지시하지만, 이 대기는 브라우저가 열려 있는 전체 시간 동안 유지됩니다. 따라서 페이지의 요소를 검색하면 암시적 대기가 설정된 시간이 걸릴 수 있습니다.

명시적 대기()

  • 명시적 대기 특정 조건이 충족되거나 최대 시간이 경과할 때까지 테스트 실행을 정지하는 데 사용됩니다.

웹드라이버기다려

  • 어떤 조건에도 사용할 수 있습니다. 이는 ExpectedCondition과 함께 WebDriverWait를 사용하여 달성할 수 있습니다.
  • 요소를 동적으로 기다리는 가장 좋은 방법은 매초마다 조건을 확인하고 조건이 충족되자마자 스크립트에서 다음 명령을 계속하는 것입니다.

하지만 이러한 모든 대기의 문제는 시간 초과 단위를 언급해야 한다는 것입니다. 해당 요소가 시간 내에 여전히 존재하지 않으면 어떻게 되나요? 따라서 Fluent wait라는 대기가 하나 더 있습니다.

유창한 대기

  • 이는 시간 초과 및 폴링 간격이 있는 Wait 인터페이스의 구현입니다. 각 FluentWait 인스턴스는 조건을 기다리는 최대 시간과 조건을 확인하는 빈도를 결정합니다.

Ajax 호출 처리의 과제 Selenium 웹드라이버

  • Ajax 호출을 처리하기 위해 "pause" 명령을 사용하는 것은 완전히 안정적이지 않습니다. 일시 중지 시간이 길면 테스트가 허용할 수 없을 정도로 느려지고 지원 시간. 대신, "waitforcondition"이 Ajax 애플리케이션 테스트에 더 도움이 될 것입니다.
  • 특정 Ajax 애플리케이션과 관련된 위험을 평가하기는 어렵습니다.
  • 개발자가 Ajax 애플리케이션을 자유롭게 수정할 수 있게 되면 테스트 프로세스가 어려워집니다.
  • 자동화된 테스트 요청을 생성하는 것은 AJAX 애플리케이션과 같은 테스트 도구가 POST 데이터를 제출하기 위해 종종 다른 인코딩이나 직렬화 기술을 사용하기 때문에 어려울 수 있습니다.

Ajax HANDLING을 사용한 코드 예제 Selenium 웹드라이버

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

요약

  • AJAX를 사용하면 웹 페이지가 전체 페이지를 다시 로드하지 않고도 서버에서 소량의 데이터를 검색할 수 있습니다.
  • Ajax 애플리케이션을 테스트하려면 다양한 대기 방법을 적용해야 합니다.
    • 스레드슬립
    • 암시적 대기
    • 명시적 대기
    • 웹드라이버기다려
    • 유창한 대기
  • 자동화된 테스트 요청을 생성하는 것은 AJAX 애플리케이션과 같은 테스트 도구가 POST 데이터를 제출하기 위해 종종 다른 인코딩이나 직렬화 기술을 사용하기 때문에 어려울 수 있습니다.