왜 우리는 셀레늄을 기다릴 필요가 있습니까?
대부분의 웹 애플리케이션은 Ajax와 Javascript를 사용하여 개발되었습니다. 페이지가 브라우저에 의해로드 될 때 상호 작용하려는 요소는 다른 시간 간격으로로드 될 수 있습니다.
요소 식별이 어려울뿐 아니라 요소가 없으면 " ElementNotVisibleException"예외가 발생합니다. Waits를 사용하여이 문제를 해결할 수 있습니다.
테스트에서 암시 적 및 명시 적 대기를 모두 사용해야하는 시나리오를 고려해 보겠습니다. 암시 적 대기 시간이 20 초로 설정되고 명시 적 대기 시간이 10 초로 설정되었다고 가정하십시오.
명시 적 대기 (10 초)로 정의 된 시간 프레임 내에 요소가 없으면 암시 적 대기로 정의 된 시간 프레임을 사용할 것입니다 (Explicit Wait). "ExpectedConditions "(Explicit Wait) 가있는 요소를 찾으려고합니다. 20 초) " ElementNotVisibleException "을 던집니다 .
셀렌 웹 드라이버 대기
- 암시 적 대기(Implicit Wait)
- 명시 적 대기(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에서 사용할 수있는 예상 조건입니다.
- alertIsPresent()
- elementSelectionStateToBe()
- elementToBeClickable()
- elementToBeSelected()
- frameToBeAvaliableAndSwitchToIt()
- invisibilityOfTheElementLocated()
- invisibilityOfElementWithText()
- presenceOfAllElementsLocatedBy()
- presenceOfElementLocated()
- textToBePresentInElement()
- textToBePresentInElementLocated()
- textToBePresentInElementValue()
- titleIs()
- titleContains()
- visibilityOf()
- visibilityOfAllElements()
- visibilityOfAllElementsLocatedBy()
- 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」를 슬로우합니다.
암시 적 대기와 명시 적 대기의 차이점
|
|
|
|
|
|
'자동화테스트 > Selenium' 카테고리의 다른 글
Selenium Webdriver의 Excel 파일에서 데이터 읽기 및 쓰기 : POI 및 JXL (0) | 2018.12.05 |
---|---|
TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화 (0) | 2018.12.04 |
XPath에는 Selenium WebDriver의 형제, 조상 함수가 포함 (0) | 2018.12.02 |
Selenium WebDriver의 Alert(경고창) & Popup Window(팝업창) Handling(다루기) (1) | 2018.11.30 |
명령 프롬프트에서 TestNG 프로젝트 및 실패한 테스트 케이스를 실행하는 방법 (0) | 2018.11.28 |