자동화테스트/Selenium2018. 12. 21. 08:00


Ajax는 빠르고 동적 인 웹 페이지를 만드는 데 사용되는 기술입니다. 이 기술은 비동기식이며 Javascript와 XML의 조합을 사용합니다.

전체 페이지를 다시로드하지 않고 웹 페이지의 파트를 업데이트합니다.

AJAX 기술을 사용하는 유명한 응용 프로그램 중 일부는 Gmail, Google지도, Facebook, Youtube 등입니다. 




이 튜토리얼에서는,

Ajax 란 무엇인가?

AJAX는 Asynchronous JavaScript & XML의 약자이며 웹 페이지가 전체 페이지를 다시로드하지 않고도 서버에서 적은 양의 데이터를 검색 할 수 있도록합니다.

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

Selenium Webdriver에서 AJAX 호출 처리

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

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

Selenium Webdriver를 사용하여 Ajax 호출을 처리하는 방법

Ajax 호출을 처리에서 가장 큰 도전은 웹 페이지의 로딩 시간을 알고있다. 웹 페이지의 로딩은 불과 몇 초 동안 지속되므로 테스터가 자동화 도구를 통해 이러한 응용 프로그램을 테스트하기가 어렵습니다. 이를 위해 Selenium Webdriver는이 Ajax 호출에서 wait 메소드를 사용해야합니다.

따라서이 wait 명령을 실행하면 현재 테스트 사례 의 실행을 일시 중단 하고 예상 값이나 새 값을 기다립니다. 새 값이나 필드가 나타나면 일시 중단 된 테스트 케이스가 Selenium Webdriver에 의해 실행됩니다.

다음은 Selenium Webdriver가 사용할 수있는 대기 메소드입니다.

  1. Thread.Sleep ()
  • Thread.Sleep ()은 지정된 시간 동안 현재 스레드를 일시 중단하므로 현명한 선택이 아닙니다.
  • AJAX에서는 정확한 대기 시간을 확신 할 수 없습니다. 따라서 요소가 대기 시간 내에 나타나지 않으면 테스트가 실패합니다. 또한 Thread.sleep (t)을 호출하면 현재 스레드가 실행 대기열에서 대기 대기열로 이동하므로 오버 헤드가 증가합니다.
  • 시간 't'에 도달하면 현재 스레드가 대기열에서 준비 대기열로 이동 한 다음 CPU에서 선택하여 실행하는 데 시간이 걸립니다.
  1. Implicit Wait() 암시 적 대기 ()
  • 이 메소드는 요소를 즉시 사용할 수없는 경우 webdriver가 대기하도록 지시하지만 브라우저가 열려있는 동안이 대기 시간이 그대로 유지됩니다. 따라서 페이지의 요소를 검색하면 암시 적 대기 시간이 설정 될 수 있습니다.
  1. Explicit Wait() 명시 적 대기 ()
  • 명시 적 대기 는 특정 조건이 충족되거나 최대 시간이 경과 할 때까지 테스트 실행을 고정시키는 데 사용됩니다.
  1. WebdriverWait
  • 어떤 조건에서도 사용할 수 있습니다. ExpectedCondition과 함께 WebDriverWait을 사용하여이 작업을 수행 할 수 있습니다.
  • 요소를 동적으로 기다리는 가장 좋은 방법은 매 초마다 조건을 확인하고 조건이 충족되는 즉시 스크립트에서 다음 명령을 계속 수행하는 것입니다.

그러나이 모든 대기 시간의 문제는 타임 아웃 단위에 대해 언급해야한다는 것입니다. 해당 요소가 아직 시간 내에 존재하지 않는다면 어떻게 될까요? 따라서 Fluent wait라는 대기가 하나 더 있습니다.

  1. Fluent Wait 유창한 대기
  • 이것은 타임 아웃 및 폴링 간격을 갖는 Wait 인터페이스의 구현입니다. 각 FluentWait 인스턴스는 조건을 확인할 최대 빈도와 조건을 확인할 빈도를 결정합니다.

Selenium Webdriver에서 Ajax 호출을 처리 할 때의 문제점

  • Ajax 호출을 처리하기 위해 "일시 중지"명령을 사용하는 것은 완전히 신뢰할 수 없습니다. 긴 멈춤 시간은 시험을 받아 들일 수 없을 정도로 느리게 만들고 시험 시간을 증가시킵니다 대신, "waitforcondition"은 Ajax 애플리케이션을 테스트 할 때 더 유용 할 것이다.
  • 특정 Ajax 응용 프로그램과 관련된 위험을 평가하는 것은 어렵습니다.
  • 개발자가 Ajax 응용 프로그램을 수정할 수있는 자유가 주어지면 테스트 프로세스가 까다로워집니다.
  • AJAX 응용 프로그램은 다른 인코딩이나 직렬화 기술을 사용하여 POST 데이터를 제출하기 때문에 자동화 된 테스트 요청을 작성하는 것이 테스트 도구에서는 어려울 수 있습니다.

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");
		//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));
		
		// ajax 호출을 수행하기 전에 텍스트를 가져옵니다.
		WebElement noTextElement = driver.findElement(By.className("radiobutton"));
		String textBefore = noTextElement.getText().trim();
		
		// 라디오 버튼을 클릭합니다
		driver.findElement(By.id("yes")).click();
	
		// Check Button을 클릭하니다.
		driver.findElement(By.id("buttoncheck")).click();
		
		/ * ajax 호출 후에 텍스트를 얻는다. * /
		WebElement TextElement = driver.findElement(By.className("radiobutton"));
		wait.until(ExpectedConditions.visibilityOf(TextElement));
		String textAfter = TextElement.getText().trim();
		
		/ * ajax 호출 전과 ajax 호출 텍스트 후에 두 텍스트를 모두 확인 * /
		Assert.assertNotEquals(textBefore, textAfter);
		System.out.println("Ajax Call Performed");
		
		String expectedText = "Radio button is checked and it's value is Yes";
		
		/ * ajax 호출 후 텍스트가 업데이트 된 예상 텍스트 확인 * /
		Assert.assertEquals(textAfter, expectedText);
		driver.close();
	}
	
}

개요:

  • AJAX를 사용하면 웹 페이지가 전체 페이지를 다시로드하지 않고 서버에서 소량의 데이터를 검색 할 수 있습니다.
  • Ajax 애플리케이션을 테스트하려면 다른 대기 메소드가 적용되어야한다.
    • ThreadSleep
    • Implicit Wait
    • Explicit Wait
    • WebdriverWait
    • Fluent Wait
  • AJAX 응용 프로그램은 다른 인코딩이나 직렬화 기술을 사용하여 POST 데이터를 제출하기 때문에 자동화 된 테스트 요청을 작성하는 것이 테스트 도구에서는 어려울 수 있습니다.


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
Posted by 프리스케이터