Selenium 대기 - 암시적, 명시적 및 유창한 대기
In Selenium, "대기"는 테스트 실행에 중요한 역할을 합니다. 이 튜토리얼에서는 암시적 대기와 명시적 대기의 다양한 측면과 차이점을 배웁니다. Selenium.
왜 대기가 필요한가요? Selenium?
대부분의 웹 애플리케이션은 다음을 사용하여 개발됩니다. 아약스 and Javascript. 브라우저가 페이지를 로드할 때 상호 작용하려는 요소는 서로 다른 시간 간격으로 로드될 수 있습니다.
이는 요소를 식별하기 어렵게 만들 뿐만 아니라 요소를 찾을 수 없는 경우 "요소NotVisible예외" 예외. 사용 Selenium 잠깐만요. 이 문제를 해결할 수 있습니다.
테스트에서 암시적 대기와 명시적 대기를 모두 사용해야 하는 시나리오를 고려해 보겠습니다. 암시적 대기 시간이 20초로 설정되고 명시적 대기 시간이 10초로 설정되었다고 가정합니다.
다음과 같은 요소를 찾으려고 한다고 가정해 보겠습니다. “예상 조건 “(명시적 대기), 요소가 명시적 대기(10초)로 정의된 시간 프레임 내에 위치하지 않으면 “를 throw하기 전에 암시적 대기(20초)로 정의된 시간 프레임을 사용합니다.요소NotVisible예외".
Selenium 웹 드라이버 대기
- 암시적 대기
- 명시적 대기
이 튜토리얼에서는 다양한 유형의 대기에 대해 알아봅니다. Selenium:
암시적 대기 Selenium
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 암시적 대기 Selenium 웹 드라이버가 "No Such Element Exception"을 throw하기 전에 일정 시간 동안 기다리라고 알리는 데 사용됩니다. 기본 설정은 0입니다. 시간을 설정하면 웹 드라이버는 예외를 throw하기 전에 해당 시간 동안 요소를 기다립니다.
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(); } }
코드 설명
위의 예에서
다음 코드를 고려하세요.
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
암묵적 대기는 2개의 매개변수를 허용합니다. 첫 번째 매개변수는 시간을 정수 값으로 허용하고 두 번째 매개변수는 초, 분, 밀리초, 마이크로초, 나노초, 일, 시간 등의 단위로 시간을 측정합니다.
명시적 대기 Selenium
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 명시적 대기 Selenium 웹 드라이버에 특정 조건(예상 조건) 또는 초과된 최대 시간을 기다리라고 알리는 데 사용되며, "ElementNotVisibleException" 예외를 throw하기 전에 사용합니다. 지능적인 대기 유형이지만 지정된 요소에만 적용할 수 있습니다. 동적으로 로드된 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(); } }
코드 설명
다음 코드를 고려하세요.
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대기” 클래스 또는 “예상 조건” 중 먼저 발생하는 일이 발생합니다.
위의 Java 코드는 "에 정의된 대로 20초의 시간 프레임 동안 요소를 기다리고 있다고 명시합니다.WebDriver대기” 수업은 “예상 조건"가 충족되고 조건은 "입니다.visibleofElementLocated".
다음은 사용할 수 있는 예상 조건입니다. Selenium 명시적 대기
- 경고IsPresent()
- elementSelectionStateToBe()
- 요소ToBeClickable()
- elementToBeSelected()
- 프레임ToBeAvaliableAndSwitchToIt()
- invisibilityOfTheElementLocated()
- invisibilityOfElementWithText()
- PresenceOfAllElementsLocatedBy()
- 존재요소위치()
- 텍스트ToBePresentInElement()
- 텍스트ToBePresentInElementLocated()
- 텍스트ToBePresentInElementValue()
- 제목은()
- 제목포함()
- 가시성()
- 가시성OfAllElements()
- visibleOfAllElementsLocatedBy()
- visibleOfElementLocated()
유창한 대기 Selenium
이 어플리케이션에는 XNUMXµm 및 XNUMXµm 파장에서 최대 XNUMXW의 평균 출력을 제공하는 유창한 대기 Selenium 웹 드라이버가 조건을 기다리는 최대 시간과 "ElementNotVisibleException" 예외를 throw하기 전에 조건을 확인하고자 하는 빈도를 정의하는 데 사용됩니다. 개체가 발견되거나 시간 초과가 발생할 때까지 정기적으로 웹 요소를 확인합니다.
주파수 : 일정한 시간 간격으로 상태를 확인/점검하기 위한 시간 프레임으로 반복 주기를 설정
요소가 다른 시간 간격으로 로드되는 시나리오를 고려해 보겠습니다. 요소는 10초의 명시적 대기를 선언하면 20초, 20초 또는 그 이상 내에 로드될 수 있습니다. 예외를 throw하기 전에 지정된 시간까지 기다립니다. 이러한 시나리오에서 fluent wait은 요소를 찾을 때까지 또는 최종 타이머가 끝날 때까지 다른 빈도로 요소를 찾으려고 하기 때문에 사용하기에 이상적인 대기입니다.
유창한 대기 구문:
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() ; } }
코드 설명
다음 코드를 고려하세요.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) .withTimeout(30, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class);
위의 예에서는 시간 제한이 30초인 유창한 대기를 선언하고 있으며 빈도는 '를 무시하여 5초로 설정됩니다.NoSuchElementException"
다음 코드를 고려하세요.
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초마다 웹 페이지에서 요소를 확인한다는 의미입니다. 요소가 이 시간 프레임 내에 있는 경우 작업을 수행하고 그렇지 않으면 "요소NotVisible예외"
또한 확인:- Selenium 초보자를 위한 IDE 튜토리얼
암시적 대기와 명시적 대기의 차이점
다음은 암묵적 대기와 명시적 대기의 주요 차이점입니다. Selenium:
암시적 대기 | 명시적 대기 |
---|---|
암시적 대기 시간은 스크립트의 모든 요소에 적용됩니다. | 명시적 대기 시간은 당사가 의도한 요소에만 적용됩니다. |
암시적 대기에서는 다음이 필요합니다. 지원 찾을 요소에 "ExpectedConditions"를 지정합니다. | 명시적 대기에서는 찾을 요소에 "ExpectedConditions"를 지정해야 합니다. |
지정된 시간 프레임에 요소가 위치할 때 사용하는 것이 좋습니다. Selenium 암시적 대기 | 요소를 로드하는 데 시간이 오래 걸릴 때나 (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)와 같은 요소의 속성을 확인하는 데 사용하는 것이 좋습니다. |
결론
암시적, 명시적 및 유창한 대기는 다음에서 사용되는 서로 다른 대기입니다. Selenium. 이러한 대기의 사용은 전적으로 서로 다른 시간 간격으로 로드되는 요소를 기반으로 합니다. Thread.Sleep()을 사용하는 것은 항상 권장되지 않습니다. 지원 애플리케이션을 구축하거나 프레임워크를 구축하는 것입니다.
또한 확인:- Selenium 초보자를 위한 튜토리얼: 7일 만에 WebDriver 배우기