자동화테스트/Selenium2018. 12. 3. 20:00

왜 우리는 셀레늄을 기다릴 필요가 있습니까?

대부분의 웹 애플리케이션은 Ajax와 Javascript를 사용하여 개발되었습니다. 페이지가 브라우저에 의해로드 될 때 상호 작용하려는 요소는 다른 시간 간격으로로드 될 수 있습니다.

요소 식별이 어려울뿐 아니라 요소가 없으면 " ElementNotVisibleException"예외가 발생합니다. Waits를 사용하여이 문제를 해결할 수 있습니다.

테스트에서 암시 적 및 명시 적 대기를 모두 사용해야하는 시나리오를 고려해 보겠습니다. 암시 적 대기 시간이 20 초로 설정되고 명시 적 대기 시간이 10 초로 설정되었다고 가정하십시오.

명시 적 대기 (10 초)로 정의 된 시간 프레임 내에 요소가 없으면 암시 적 대기로 정의 된 시간 프레임을 사용할 것입니다 (Explicit Wait). "ExpectedConditions "(Explicit Wait) 가있는 요소를 찾으려고합니다. 20 초) " ElementNotVisibleException "을 던집니다 .

셀렌 웹 드라이버 대기

  1. 암시 적 대기(Implicit Wait)
  2. 명시 적 대기(Explicit Wait)

암시 적 대기(Implicit Wait)

Selenium Web Driver는 Watir의 암시 적 대기에 대한 아이디어를 빌렸습니다.

암시 적 대기는 "No Elements Exception"을 throw하기 전에 일정 시간 기다리기 위해 웹 드라이버에게 알려줍니다. 기본 설정은 0입니다. 시간을 설정하면 웹 드라이버는 예외를 throw하기 전에 해당 시간 동안 대기합니다.

아래 예제에서 우리는 10 초의 시간 프레임으로 암시 적 대기를 선언했습니다. 요소가 해당 시간 프레임 내의 웹 페이지에 있지 않으면 예외를 throw합니다.

암시 적 대기를 선언하려면 다음을 수행하십시오.

구문 :

driver.manage (). timeouts (). implicitlyWait (TimeOut, TimeUnit.SECONDS);				
package guru.test99;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class AppTest {
	
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// Chrome을 시작하고 기본 URL로 리디렉션합니다.
	driver.get("http://demo.guru99.com/test/guru99home/" );
	// 브라우저 창을 최대화합니다.
	driver.manage().window().maximize() ;
	// 제목의 실제 값을 얻는다.
	aTitle = driver.getTitle();
	// 실제 제목과 예상 제목을 비교합니다.
	if (aTitle.equals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	// 브라우저를 닫습니다.
	driver.close();
}
}

코드 설명

위의 예에서,

다음 코드를 고려하십시오.

driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);

암시 적 대기는 2 개의 매개 변수를 허용하며, 첫 번째 매개 변수는 시간을 정수 값으로 받아들이고 두 번째 매개 변수는 SECONDS, MINUTES, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS 등으로 시간 측정을 허용합니다.

명시 적 대기(Explicit Wait)

명시 적 대기는 Web Driver에게 ElementNotVisibleException "예외를 throw하기 전에 특정 조건 ( Expected Conditions ) 또는 최대 시간을 초과 할 때까지 대기하도록 지시하는 데 사용됩니다 .

명시 적 대기는 지능적인 종류의 대기이지만 지정된 요소에만 적용 할 수 있습니다. 명시 적 대기는 동적으로로드 된 Ajax 요소를 기다리기 때문에 암시 적 대기보다 더 나은 옵션을 제공합니다.

명시적인 대기를 선언하면 " ExpectedCondtions " 를 사용 하거나 Fluent Wait을 사용하여 조건 확인 빈도를 구성 할 수 있습니다 요즘 우리는 Thread.Sleep ()을 사용하여 구현하는 동안 일반적으로 사용하지 않는 것이 좋습니다.

아래 예제에서는 " WebDriverWait "클래스에 대한 참조 대기를 만들고 WebDriver "참조를 사용하여 인스턴스를 생성 하고 있으며 최대 시간 프레임은 20 초입니다.

구문:

WebDriverWait wait = 새 WebDriverWait (WebDriverRefrence, TimeOut);
package guru.test99;

import java.util.concurrent.TimeUnit;
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.annotations.Test;

public class AppTest2 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	WebDriverWait wait=new WebDriverWait(driver, 20);
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// Chrome을 시작하고 기본 URL로 리디렉션합니다.
	driver.get("http://demo.guru99.com/test/guru99home/" );
	// 브라우저 창을 최대화합니다.
	driver.manage().window().maximize() ;
	// 제목의 실제 값을 얻는다.
	aTitle = driver.getTitle();
	// 실제 제목과 예상 제목을 비교합니다.
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	WebElement guru99seleniumlink;
	guru99seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath( "/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
	guru99seleniumlink.click();
	}
	
}

코드 설명

다음 코드를 고려하십시오.

WebElement guru99seleniumlink;
/ div / div [1] / div / div / div / div / div / div / div / div [1] / div / div [1] / div / div [1] div / div [2] / div [2] / div / div / div / div / div [1] / div / div / a / i "))));
 	guru99seleniumlink.click ();

위의 예에서 " WebDriverWait "클래스에 정의 된 시간 또는 " ExpectedConditions "중 먼저 발생 하는 시간을 기다립니다 .

위의 Java 코드 는 " ExpectedConditions "가 충족되고 조건이 " visibilityofElementLocated " 가 될 때까지 웹 페이지 의 " WebDriverWait "클래스에 정의 된대로 20 초의 시간 요소에 대한 요소를 기다리고 있음을 나타 냅니다.

다음은 Explicit Wait에서 사용할 수있는 예상 조건입니다.

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. presenceOfAllElementsLocatedBy()
  9. presenceOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titleContains()
  15. visibilityOf()
  16. visibilityOfAllElements()
  17. visibilityOfAllElementsLocatedBy()
  18. visibilityOfElementLocated()

유창한 대기(Fluent Wait)

유창한 대기 시간은 웹 드라이버에게 조건을 기다리고 , "ElementNotVisibleException"예외를 throw하기 전에 조건을 확인하려는 빈도 를 알리는 데 사용됩니다 .

빈도 : 정기적 인 시간 간격으로 조건을 확인 / 확인하기 위해 시간 프레임과 함께 반복주기 설정

요소가 다른 시간 간격으로로드되는 시나리오를 생각해 봅시다. 요소가 명시 적으로 20 초 대기한다고 선언하면 요소가 10 초, 20 초 또는 그 이상으로로드 될 수 있습니다. 그것은 예외를 던지기 전에 지정된 시간까지 기다릴 것입니다. 이러한 시나리오에서 유창한 대기 시간은 사용하기에 이상적인 대기 시간입니다. 발견하기 전까지는 다른 주파수로 요소를 찾거나 최종 타이머가 만료 될 때까지 기다립니다.

구문:

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);
package guru.test99;

import org.testng.annotations.Test;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

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.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest3 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	driver = new ChromeDriver();
	// Chrome을 시작하고 기본 URL로 리디렉션합니다.
	driver.get("http://demo.guru99.com/test/guru99home/" );
	// 브라우저 창을 최대화합니다.
	driver.manage().window().maximize() ;
	// 제목의 실제 값을 얻는다.
	aTitle = driver.getTitle();
	// 실제 제목과 예상 제목을 비교합니다.
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
		}
	
	Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
			.withTimeout(30, TimeUnit.SECONDS) 			
			.pollingEvery(5, TimeUnit.SECONDS) 			
			.ignoring(NoSuchElementException.class);
	WebElement clickseleniumlink = wait.until(new Function<Webdriver, WebElement>(){
	
		public WebElement apply(WebDriver driver ) {
			return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
		}
	});
	// 셀렌 링크를 클릭하십시오.
	clickseleniumlink.click();
	// 브라우저를 닫습니다 ~
	driver.close() ;
	}
}

코드 설명

다음 코드를 고려하십시오.

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
	.withTimeout(30, TimeUnit.SECONDS) 			
	.pollingEvery(5, TimeUnit.SECONDS) 			
	.ignoring(NoSuchElementException.class);				

위의 예제에서 우리는 30 초의 시간 초과로 유창한 대기를 선언하고 " NoSuchElementException " 을 무시하여 빈도를 5 초로 설정했습니다.

다음 코드를 고려하십시오.

public WebElement apply(WebDriver driver ) {
	return 		driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
}						

우리는 페이지에서 웹 요소를 식별하는 새로운 기능을 만들었습니다. 예 : 여기 웹 요소는 웹 페이지의 셀렌 링크뿐입니다.

빈도는 5 초로 설정되고 최대 시간은 30 초로 설정됩니다. 따라서 이것은 30 초의 최대 시간 동안 매 5 초마다 웹 페이지의 요소를 검사한다는 것을 의미합니다. 요소가이 시간 프레임 내에있는 경우, 그 요소는 「ElementNotVisibleException」를 슬로우합니다.

암시 적 대기와 명시 적 대기의 차이점

암시 적 대기
(Implicit Wait)

명시 적 대기
(Explicit Wait)
  • 암시 적 대기 시간은 스크립트의 모든 요소에 적용됩니다.
  • 명시 적 대기 시간은 우리가 의도 한 요소에만 적용됩니다.
  • Implicit Wait 에서 찾을 요소에 "ExpectedConditions"를 지정할 필요가 없습니다.
  • Explicit Wait에서 찾을 요소에 대해 "ExpectedConditions"를 지정해야합니다.
  • 요소가 암시 적 대기열에 지정된 시간 프레임에있을 때 사용하는 것이 좋습니다
  • 요소를로드하는 데 오랜 시간이 걸리거나 (visibilityOfElementLocated, elementToBeClickable, elementToBeSelected) 같은 요소의 속성을 확인하는 데 사용하는 것이 좋습니다.


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