Selenium 대기 - 암시적, 명시적 및 유창한 대기


In Selenium, "대기"는 테스트 실행에 중요한 역할을 합니다. 이 튜토리얼에서는 암시적 대기와 명시적 대기의 다양한 측면과 차이점을 배웁니다. Selenium.

왜 대기가 필요한가요? Selenium?

대부분의 웹 애플리케이션은 다음을 사용하여 개발됩니다. 아약스자바 스크립트. 브라우저가 페이지를 로드할 때 상호 작용하려는 요소는 서로 다른 시간 간격으로 로드될 수 있습니다.

이는 요소를 식별하기 어렵게 만들 뿐만 아니라 요소를 찾을 수 없는 경우 "요소NotVisible예외" 예외. 사용 Selenium 잠깐만요. 이 문제를 해결할 수 있습니다.

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

다음과 같은 요소를 찾으려고 한다고 가정해 보겠습니다. “예상 조건 “(Explicit Wait), 요소가 Explicit wait(10초)에 의해 정의된 시간 프레임 내에 위치하지 않으면 Thro 앞에 Implicit wait(20초)에 정의된 시간 프레임을 사용합니다.wing "요소NotVisible예외".

Selenium 웹 드라이버 대기

  1. 암시적 대기
  2. 명시적 대기

이 튜토리얼에서는 다양한 유형의 대기에 대해 알아봅니다. Selenium:

암시적 대기 Selenium

XNUMXD덴탈의 암시적 대기 Selenium 웹 드라이버가 "No Such Element Exception"을 발생시키기 전에 일정 시간 동안 기다리도록 지시하는 데 사용됩니다. 기본 설정은 0입니다. 시간을 설정하면 웹 드라이버는 시작하기 전에 해당 시간 동안 요소를 기다립니다.wing 예외.

Selenium 웹 드라이버는 암시적 대기 개념을 차용했습니다. Watir.

아래 예에서는 10초의 시간 프레임으로 암시적 대기를 선언했습니다. 이는 해당 요소가 해당 기간 내에 웹페이지에 없으면 예외가 발생함을 의미합니다.

암시적 대기를 선언하려면 Selenium 웹드라이버:

암시적 대기 구문:

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 = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("http://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.equals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	//close browser
	driver.close();
}
}

코드 설명

위의 예에서

Follo를 고려해보세요wing 암호:

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

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

명시적 대기 Selenium

XNUMXD덴탈의 명시적 대기 Selenium 웹 드라이버에게 특정 조건(예상 조건)을 기다리거나 최대 시간이 초과되기 전에 기다리도록 지시하는 데 사용됩니다.wing "ElementNotVisibleException" 예외. 이는 지능적인 종류의 대기이지만 지정된 요소에만 적용할 수 있습니다. 동적으로 로드된 Ajax 요소를 기다리므로 암시적 대기보다 더 나은 옵션을 제공합니다.

명시적으로 대기를 선언한 후에는 "를 사용해야 합니다.예상 조건” 또는 다음을 사용하여 상태를 확인하려는 빈도를 구성할 수 있습니다. 유창한 대기. 요즘 구현하는 동안 우리는 사용하고 있습니다 스레드.수면() 일반적으로 사용하지 않는 것이 좋습니다.

아래 예에서는 '에 대한 참조 대기를 생성합니다.WebDriver대기” 클래스 및 “를 사용하여 인스턴스화웹드라이버”를 참조하여 최대 20초의 시간 범위를 제공하고 있습니다.

명시적 대기 구문:

WebDriverWait wait = new 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 = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("http://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	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();
	}
	
}

코드 설명

Follo를 고려해보세요wing 암호:

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

이 WebDriver 대기 예에서는 '에 정의된 시간 동안 기다립니다.WebDriver대기” 클래스 또는 “예상 조건” 중 먼저 발생하는 일이 발생합니다.

위의 자바 코드는 "에 정의된 대로 20초의 시간 프레임 동안 요소를 기다리고 있다고 명시합니다.WebDriver대기” 수업은 “예상 조건"가 충족되고 조건은 "입니다.visibleofElementLocated".

더 폴로wing 다음에서 사용할 수 있는 예상 조건은 다음과 같습니다. Selenium 명시적 대기

  1. 경고IsPresent()
  2. elementSelectionStateToBe()
  3. 요소ToBeClickable()
  4. elementToBeSelected()
  5. 프레임ToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. PresenceOfAllElementsLocatedBy()
  9. 존재요소위치()
  10. 텍스트ToBePresentInElement()
  11. 텍스트ToBePresentInElementLocated()
  12. 텍스트ToBePresentInElementValue()
  13. 제목은()
  14. 제목포함()
  15. 가시성()
  16. 가시성OfAllElements()
  17. visibleOfAllElementsLocatedBy()
  18. visibleOfElementLocated()

유창한 대기 Selenium

XNUMXD덴탈의 유창한 대기 Selenium 웹 드라이버가 조건을 기다리는 최대 시간과 조건을 확인하려는 빈도를 정의하는 데 사용됩니다.wing "ElementNotVisibleException" 예외. 개체가 발견되거나 시간 초과가 발생할 때까지 정기적으로 웹 요소를 확인합니다.

주파수 : 일정한 시간 간격으로 상태를 확인/점검하기 위한 시간 프레임으로 반복 주기를 설정

요소가 서로 다른 시간 간격으로 로드되는 시나리오를 고려해 보겠습니다. 요소는 10초, 20초 또는 명시적으로 20초의 대기를 선언하는 경우 그보다 더 많은 시간 내에 로드될 수 있습니다. 시작하기 전에 지정된 시간까지 기다립니다.wing 예외. 이러한 시나리오에서는 유창한 대기가 사용하기에 이상적인 대기입니다. 요소를 찾거나 최종 타이머가 종료될 때까지 다른 빈도로 요소를 찾으려고 시도하기 때문입니다.

유창한 대기 구문:

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

위 코드는 더 이상 사용되지 않습니다. Selenium v3.11 이상. 당신은 사용해야합니다

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(Duration.ofSeconds(SECONDS))
.pollingEvery(Duration.ofSeconds(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();
	// launch Chrome and redirect it to the Base URL
	driver.get("http://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	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"));
		}
	});
	//click on the selenium link
	clickseleniumlink.click();
	//close~ browser
	driver.close() ;
	}
}

코드 설명

Follo를 고려해보세요wing 암호:

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

위의 예에서는 시간 제한이 30초인 유창한 대기를 선언하고 있으며 빈도는 '를 무시하여 5초로 설정됩니다.NoSuchElementException"

Follo를 고려해보세요wing 암호:

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

페이지에서 웹 요소를 식별하는 새로운 기능을 만들었습니다. (예: 여기서 웹 요소는 Selenium 웹페이지의 링크).

빈도는 5초로 설정되고 최대 시간은 30초로 설정됩니다. 따라서 이는 최대 5초 동안 30초마다 웹페이지의 요소를 확인한다는 의미입니다. 요소가 이 시간 프레임 내에 있으면 다음을 수행합니다. opera그렇지 않으면 “요소NotVisible예외"

또한 확인:- Selenium 초보자를 위한 IDE 튜토리얼

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

FOLLOwing 암시적 대기와 명시적 대기의 주요 차이점은 다음과 같습니다. Selenium:

암시적 대기 명시적 대기
암시적 대기 시간은 스크립트의 모든 요소에 적용됩니다. 명시적 대기 시간은 당사가 의도한 요소에만 적용됩니다.
암시적 대기에서는 다음이 필요합니다. 지원 찾을 요소에 "ExpectedConditions"를 지정합니다. 명시적 대기에서는 찾을 요소에 "ExpectedConditions"를 지정해야 합니다.
지정된 시간 프레임에 요소가 위치할 때 사용하는 것이 좋습니다. Selenium 암시적 대기 요소를 로드하는 데 시간이 오래 걸릴 때나 (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)와 같은 요소의 속성을 확인하는 데 사용하는 것이 좋습니다.

결론

암시적, 명시적 및 유창한 대기는 다음에서 사용되는 서로 다른 대기입니다. Selenium. 이러한 대기의 사용은 전적으로 서로 다른 시간 간격으로 로드되는 요소를 기반으로 합니다. Thread.Sleep()을 사용하는 것은 항상 권장되지 않습니다. 지원 애플리케이션을 구축하거나 프레임워크를 구축하는 것입니다.

또한 확인:- Selenium 초보자를 위한 튜토리얼: 7일 만에 WebDriver 배우기