암묵적 대기와 명시적 대기 Selenium 구문과 함께

⚡ 스마트 요약

Selenium 대기 명령은 자동화 스크립트를 동적 페이지 동작과 동기화하여 비동기적으로 로드되는 요소로 인한 테스트 실패를 방지합니다. 이 참조에서는 WebDriver 구문을 사용한 암시적, 명시적 및 유연한 대기 전략에 대해 설명합니다. Java 코드 샘플과 안정적이고 신뢰할 수 있는 테스트 실행을 위한 적절한 대기 시간 선택에 대한 실질적인 지침을 제공합니다.

  • ⚙️ Foundation원칙: 웹드라이버가 NoSuchElementException 예외를 발생시키기 전에 정의된 시간 동안 일시 중지되도록 암시적 대기(Implicit Wait)를 전역적으로 적용합니다.
  • 🎯 구현 초점: Ajax 또는 동적 가시성 상태에 따라 달라지는 요소를 대상으로 지정하려면 ExpectedConditions와 함께 Explicit Wait를 사용하십시오.
  • 🔁 고급 기술: 예측할 수 없는 시점에 로드되는 요소를 처리하기 위해 Fluent Wait를 폴링 간격으로 구성하십시오.
  • 최적화 전략: Thread.sleep을 조건부 대기로 대체하여 실행 시간을 줄이고 불안정한 지연을 제거하십시오.
  • 품질 영향: 올바른 대기 시간을 선택하면 불안정한 오류를 직접적으로 줄이고 환경 간 스크립트 안정성을 향상시킬 수 있습니다.

Selenium 대기 – 구문이 포함된 암시적 및 명시적 대기

In Selenium"대기(Waits)"는 안정적인 테스트 실행에 중요한 역할을 합니다. 이 튜토리얼에서는 암시적 대기(Implicit Wait)와 명시적 대기(Explicit Wait) 명령의 주요 특징과 차이점을 알아봅니다. Selenium또한, Fluent Wait의 실용적인 사용법도 함께 다룹니다.

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

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

이로 인해 원소 식별이 어려워질 뿐만 아니라, 제때 원소를 찾지 못할 경우, Selenium 던질 것이다 요소NotVisible예외. Selenium 대기(Wait)는 WebDriver에게 요소 찾기에 실패하기 전에 필요한 특정 시간 범위를 제공함으로써 이러한 동기화 문제를 해결합니다.

동일한 테스트에서 암시적 대기와 명시적 대기가 모두 사용되는 시나리오를 생각해 보겠습니다. 암시적 대기는 20초, 명시적 대기는 10초로 설정되어 있다고 가정합니다.

만약 우리가 특정 요소에 의해 지배되는 것을 찾고 있다면 예상 조건 (명시적 대기)에서 요소가 10초의 명시적 대기 시간 내에 위치하지 않으면 WebDriver는 예외를 발생시키기 전에 20초의 암시적 대기 시간으로 되돌아갑니다. 요소NotVisible예외.

Selenium WebDriver 대기 중

  1. 암시적 대기
  2. 명시적 대기
  3. 유창한 대기

암시적 대기 Selenium

The 암시적 대기 Selenium 이 설정은 WebDriver가 NoSuchElementException을 발생시키기 전에 정의된 시간 동안 대기하도록 합니다. 기본값은 0입니다. 설정이 완료되면 WebDriver는 해당 시간 동안 DOM을 폴링한 후 오류를 발생시킵니다. Selenium WebDriver는 암묵적 대기 개념을 계승했습니다. Watir.

아래 예시에서는 10초 동안의 암묵적 대기를 선언합니다. 해당 시간 내에 요소가 발견되지 않으면 예외가 발생합니다.

암묵적 대기 구문(Selenium 4) :

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
package guru.test99;
import java.time.Duration;
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 {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize 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();
    }
}

설명 Code

위 예시에서 다음 문장을 고려해 보세요.

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

Selenium 버전 4에서는 기존의 두 개의 인자(정수 + TimeUnit)를 사용하는 함수 시그니처를 단일 Duration 인자로 대체했습니다. Duration 클래스는 Duration.ofSeconds, Duration.ofMillis, Duration.ofMinutes와 같은 정적 헬퍼를 통해 초, 분, 밀리초 및 기타 시간 단위를 지원합니다.

명시적 대기 Selenium

The 명시적 대기 Selenium `Explicit Wait`는 WebDriver에게 특정 조건(예상 조건)이 충족되거나 최대 대기 시간이 경과할 때까지 기다린 후 `ElementNotVisibleException`을 발생시키도록 지시합니다. 이는 지정된 요소에만 적용되므로 더 효율적인 대기 방식입니다. 테스트에서 동적으로 로드되는 Ajax 콘텐츠를 처리해야 하는 경우 `Explicit Wait`가 `Implicit Wait`보다 선호됩니다.

명시적인 대기가 선언되면 반드시 사용해야 합니다. 예상 조건또는 다음을 사용하여 폴링 빈도를 구성할 수 있습니다. 유창한 대기. 사용을 피하세요 스레드.수면()이는 실행을 무조건 일시 중지시키기 때문이며 일반적으로 좋지 않은 관행으로 간주됩니다.

아래 예시에서는 참조를 생성합니다. WebDriver대기 클래스를 사용하여 인스턴스를 생성합니다. 웹드라이버 참조하고 최대 시간 범위를 20초로 설정합니다.

명시적 대기 구문(Selenium 4) :

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
package guru.test99;

import java.time.Duration;
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 {
        driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20));
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize 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();
    }
}

설명 Code

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

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

이 WebDriverWait 예제에서 스크립트는 정의된 대로 최대 20초 동안 대기합니다. WebDriver대기 수업, ~까지 예상 조건 만족되면, 그 중 먼저 발생하는 시점에.

위의 Java 코드는 해당 조건이 충족될 때까지 최대 20초 동안 기다립니다. 요소의 가시성 위치 사실 이겠지.

다음과 같은 예상 조건을 사용할 수 있습니다. Selenium 명시적 대기:

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

유창한 대기 Selenium

The 유창한 대기 Selenium 이 속성은 WebDriver가 조건을 기다리는 최대 시간과 ElementNotVisibleException을 발생시키기 전에 해당 조건을 확인하는 폴링 빈도를 정의합니다. Fluent Wait는 객체를 찾거나 타임아웃이 만료될 때까지 일정한 간격으로 요소의 존재 여부를 확인합니다.

주파수 : 정기적인 간격으로 상태를 평가하기 위한 반복 주기.

요소가 예측할 수 없는 간격으로 로드되는 시나리오를 생각해 보세요. 요소가 로드되는 데 10초, 20초 또는 그 이상이 걸릴 수 있습니다. 만약 20초라는 명시적인 대기 시간을 지정하면 스크립트는 오류가 발생하기 전에 전체 시간 동안 기다립니다. 이러한 경우 Fluent Wait는 요소가 로드되거나 최종 타이머가 만료될 때까지 지정된 빈도로 폴링하기 때문에 이상적인 선택입니다.

유창한 대기 구문(Selenium 4) :

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

정수 값과 TimeUnit을 허용하는 이전 서명 방식은 더 이상 사용되지 않습니다. Selenium 3.11 버전에서 제거되었습니다. Selenium 4. 위에 제시된 기간 기반 API가 현재 권장되는 접근 방식입니다.

package guru.test99;

import java.time.Duration;
import java.util.NoSuchElementException;
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.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.testng.annotations.Test;

public class AppTest3 {
    protected WebDriver driver;

    @Test
    public void guru99tutorials() throws InterruptedException {
        String eTitle = "Demo Guru99 Page";
        String aTitle = "";
        driver = new ChromeDriver();
        // launch Chrome and redirect it to the Base URL
        driver.get("https://demo.guru99.com/test/guru99home/");
        // Maximize 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<>(driver)
            .withTimeout(Duration.ofSeconds(30))
            .pollingEvery(Duration.ofSeconds(5))
            .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();
    }
}

설명 Code

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

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

위 예시에서는 타임아웃을 30초, 폴링 빈도를 5초로 설정하고 무시하는 Fluent Wait를 선언했습니다. 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초의 타임아웃으로, 대기 스크립트는 최대 30초 동안 5초마다 해당 요소의 존재 여부를 확인합니다. 해당 시간 내에 요소가 존재하면 스크립트가 계속 실행됩니다. 그렇지 않으면, 요소NotVisible예외 던져집니다.

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

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

아래 표는 암묵적 대기와 명시적 대기의 주요 차이점을 보여줍니다. Selenium.

암시적 대기 명시적 대기
스크립트의 모든 요소에 암묵적인 대기 시간이 적용됩니다. 명시적 대기 시간은 특별히 지정된 요소에만 적용됩니다.
암묵적 대기에서는 요소에 대해 ExpectedConditions가 지정되지 않습니다. 명시적 대기(Explicit Wait)에서는 요소에 대해 ExpectedConditions를 정의해야 합니다.
구성된 암시적 대기 시간 내에 요소가 로드될 때 권장됩니다. 요소 로딩 시간이 오래 걸리거나 visibilityOfElementLocated, elementToBeClickable, elementToBeSelected와 같은 요소 상태를 검증할 때 권장됩니다.
한 번 설정하면 WebDriver 인스턴스 수명 주기 동안 적용됩니다. 요소별 또는 검사별로 설정하여 더욱 세밀한 제어가 가능합니다.

적절한 대기 전략을 선택하는 방법

올바른 대기 명령을 선택하는 것은 스크립트의 안정성과 실행 시간에 직접적인 영향을 미칩니다. 이 결정 프레임워크를 사용하여 각 시나리오에 적합한 옵션을 선택하십시오.

  1. 부하 패턴을 파악하십시오: 요소가 Ajax 응답 후 고정된 시간에 나타나는지, 아니면 예측할 수 없는 간격으로 나타나는지 확인합니다. 고정된 로딩 시간에는 Implicit Wait가 적합하고, 예측할 수 없는 로딩 시간에는 Fluent Wait가 적합합니다.
  2. 암시적 대기와 명시적 대기를 혼합해서 사용하지 마십시오. 두 가지를 결합하면 대기 시간이 길어지는 쪽이 더 큰 영향을 미쳐 예상치 못한 지연이 발생할 수 있습니다. Selenium 문서에서는 WebDriver 세션당 하나의 전략만 사용할 것을 권장합니다.
  3. 동적 콘텐츠의 경우 기본적으로 명시적 대기를 사용합니다. 페이지가 Ajax, 조건부 렌더링 또는 애니메이션에 의존하는 경우, ExpectedConditions를 사용한 명시적 대기는 관련 요소만을 정확하게 대상으로 합니다.
  4. 가변적인 타이밍을 위해 Fluent Wait를 사용하세요. 실행 간 요소 로드 시간이 다를 경우 Fluent Wait를 폴링 간격으로 구성하십시오. 폴링은 단일의 긴 타임아웃보다 전체 대기 시간을 줄여줍니다.
  5. Thread.sleep을 교체하세요: 하드코딩된 sleep 함수는 테스트 스위트의 속도를 저하시키고 실제 타이밍 문제를 숨깁니다. 실행 속도와 예측 가능성을 유지하려면 조건부 대기로 대체하십시오.
  6. 튜닝 타임아웃 값: 처음에는 짧은 타임아웃(5~10초)으로 시작하고, 오류가 발생했을 때 실제로 부하가 느려진 것으로 나타나는 경우에만 타임아웃을 늘리십시오. 기본 타임아웃이 길면 성능 저하를 숨길 수 있습니다.
  7. 보조 유틸리티에서 대기 시간을 유지하세요: 타임아웃 정책 변경 사항이 전체 테스트 스위트에 적용되도록 대기 로직을 ​​헬퍼 클래스에 집중시키세요.

이 프레임워크를 따르면 자동화 엔지니어는 속도가 느려지거나 불안정해지지 않고 실제 애플리케이션 타이밍에 적응하는 탄력적인 스크립트를 구축할 수 있습니다.

흔히 저지르는 실수들을 피하는 방법 Selenium 기다립니다

경험이 풍부한 테스터조차도 작업을 할 때 몇 가지 반복적인 함정에 빠지곤 합니다. Selenium 대기 시간. 이러한 문제를 피하면 스크립트가 빠르고 예측 가능하며 팀과 환경 전반에 걸쳐 유지 관리가 쉬워집니다.

가장 흔한 실수 중 하나는 Thread.sleep을 과도하게 사용하는 것입니다. 하드코딩된 일시 정지는 요소의 실제 사용 가능 여부와 관계없이 스크립트가 전체 대기 시간 동안 기다리게 하여 전체 실행 시간을 늘립니다. 이러한 일시 정지는 Explicit Wait 또는 Fluent Wait으로 대체하여 조건이 충족되는 즉시 스크립트가 다음 단계로 진행되도록 하십시오.

두 번째 실수는 동일한 테스트에서 암시적 대기와 명시적 대기를 혼합해서 사용하는 것입니다. 이 두 가지 메커니즘이 함께 작동하면 디버깅하기 어려운 예측 불가능한 타임아웃이 발생할 수 있습니다. WebDriver 세션마다 하나의 전략을 선택하고 일관되게 적용하십시오.

세 번째 실수는 "혹시 모를 경우를 대비해" 타임아웃 시간을 너무 길게 설정하는 것입니다. 기본적으로 긴 타임아웃 시간은 실제 성능 문제를 숨기고 지속적 통합 파이프라인에서 피드백 속도를 저하시킵니다. 처음에는 짧은 타임아웃 시간으로 시작하고, 오류 로그를 통해 실제 타이밍 문제가 있는 것으로 확인될 때만 시간을 늘리십시오.

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

자주 묻는 질문

기본 암시적 대기 시간 Selenium WebDriver의 대기 시간은 0초입니다. 드라이버는 implicitlyWait 메서드가 사용자 지정 Duration 값으로 호출될 때까지 누락된 요소에 대해 일시 중지하지 않습니다.

`Thread.sleep`은 요소의 준비 상태와 관계없이 고정된 시간 동안 실행을 무조건 일시 중지합니다. 이는 전체 실행 시간을 증가시키고, 성능 문제를 숨기며, 테스트를 취약하게 만듭니다. 반면 명시적 대기(Explicit Wait)와 유창한 대기(Fluent Wait)는 조건이 충족되는 즉시 실행을 재개합니다.

권장하지 않습니다. Selenium 설명서에는 두 가지 방식을 함께 사용하면 예측할 수 없는 대기 시간이 발생할 수 있다고 경고합니다. 보다 명확한 동작과 손쉬운 디버깅을 위해 WebDriver 세션당 하나의 전략(일반적으로 명시적 대기 또는 유연한 대기)을 선택하십시오.

예. AI 기반 테스트 플랫폼은 다음과 같습니다. TestimMabl과 Functionize는 애플리케이션 응답 시간을 분석하고 명시적 대기(Explicit Wait) 또는 유연한 대기(Fluent Wait) 값을 권장합니다. 이러한 도구는 시행착오를 줄여주고 관찰된 페이지 동작에 따라 타임아웃 값을 동적으로 조정합니다.

AI 엔진은 과거 부하 패턴을 학습하고 폴링 간격이나 타임아웃 창을 자동으로 조정합니다. 테스트가 타이밍 경계 근처에서 반복적으로 실패할 경우, 모델은 대기 시간을 연장하거나 더 스마트한 조건으로 전환하여 실행 전반에 걸쳐 불안정한 실패를 줄입니다.

이 게시물을 요약하면 다음과 같습니다.