Selenium에서 웹 요소를 기다리는 기술 : Implicit vs Explicit


1. Implicit waits와 Explicit waits의 특징

Implicit waits


Explicit waits


이 두 방법은 웹 요소의 상태를 대기하는 방식에서 차이가 있습니다.
Implicit waits는 웹드라이버가 전체 생명주기에 걸쳐 일정 시간 동안 요소를 찾을 수 있도록 해줍니다.
반면에, Explicit waits는 조건별로 웹 요소가 충족될 때까지 대기할 수 있어 더 세밀한 제어가 가능합니다.



2. Implicit waits 활용 예시


예시 1: 페이지 로딩 후 특정 요소 찾기

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;

class ImplicitWaitExample1
{
    static void Main()
    {
        IWebDriver driver = new ChromeDriver();
        
        // 10초 동안 implicit wait 설정
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        
        driver.Navigate().GoToUrl("https://example.com");
        
        // 요소가 존재할 때까지 최대 10초 동안 기다립니다.
        IWebElement element = driver.FindElement(By.Id("sampleElement"));
        
        driver.Quit();
    }
}


예시 2: 여러 요소 찾기

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Collections.ObjectModel;

class ImplicitWaitExample2
{
    static void Main()
    {
        IWebDriver driver = new ChromeDriver();
        
        // 10초 동안 implicit wait 설정
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        
        driver.Navigate().GoToUrl("https://example.com");
        
        // 여러 요소가 존재할 때까지 최대 10초 동안 기다립니다.
        ReadOnlyCollection<IWebElement> elements = driver.FindElements(By.ClassName("sampleClass"));
        
        driver.Quit();
    }
}


3. Explicit waits 활용 예시


예시 1: 요소가 클릭 가능할 때까지 기다리기

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;

class ExplicitWaitExample1
{
    static void Main()
    {
        IWebDriver driver = new ChromeDriver();
        
        driver.Navigate().GoToUrl("https://example.com");
        
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        
        // 요소가 클릭 가능할 때까지 최대 10초 동안 기다립니다.
        IWebElement element = wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("sampleElement")));
        element.Click();
        
        driver.Quit();
    }
}


예시 2: 요소가 표시될 때까지 기다리기

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;

class ExplicitWaitExample2
{
    static void Main()
    {
        IWebDriver driver = new ChromeDriver();
        
        driver.Navigate().GoToUrl("https://example.com");
        
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        
        // 요소가 표시될 때까지 최대 10초 동안 기다립니다.
        IWebElement element = wait.Until(ExpectedConditions.VisibilityOfElementLocated(By.Id("sampleElement")));
        
        driver.Quit();
    }
}


이 두 방법 중 어떤 것을 사용할지는 테스트의 요구사항과 상황에 따라 결정해야 합니다.
하지만 일반적으로 Explicit waits는 조건별로 대기 시간을 설정할 수 있어 더 유연한 선택이 될 수 있습니다.



4. 마치며

이상으로 Selenium에서 사용되는 두 가지 주요 대기 전략, Implicit waitsExplicit waits에 대해 알아보았습니다.
두 방법은 각각의 장점과 적용 시나리오가 있으며, 웹 자동화 테스트에서 빈번하게 사용됩니다.


어느 방법이 더 좋다고 단정지을 수는 없으며, 테스트의 요구사항과 복잡성에 따라 적절한 대기 전략을 선택하는 것이 중요합니다.
테스트 자동화의 성공은 디테일에 있습니다.
단순히 코드를 실행하는 것이 아니라, 실제 사용자 경험을 얼마나 정확하게 반영하는가가 중요한데, 이를 위해서는 대기 전략을 잘 활용하는 것이 빠질 수 없는 요소입니다.






정규표현식으로 시간 절약하기
당신의 하루에 몇 시간을 더하세요
WPF MVVM 패턴, 그리고 Binding
WPF(Windows Presentation Foundation) 시리즈
AWS SAA 준비 - (4) 비용에 최적화된 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (3) 안전한 아키텍처
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (2) 성능이 뛰어난 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (1) 복원력을 갖춘 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
15분 안에 ToC를 구현해보자!
Vanilla JS로 Table of Contents 구현하기
모듈
모던 자바스크립트 Deep Dive | 48장 | 모듈
에러 처리
모던 자바스크립트 Deep Dive | 47장 | 에러 처리
제너레이터와 async/await
모던 자바스크립트 Deep Dive | 46장 | 제너레이터와 async/await
프로미스
모던 자바스크립트 Deep Dive | 45장 | 프로미스
REST API
모던 자바스크립트 Deep Dive | 44장 | REST API
Ajax
모던 자바스크립트 Deep Dive | 43장 | Ajax
비동기 프로그래밍
모던 자바스크립트 Deep Dive | 42장 | 비동기 프로그래밍
타이머
모던 자바스크립트 Deep Dive | 41장 | 타이머
Set과 Map
모던 자바스크립트 Deep Dive | 37장 | Set과 Map
디스트럭처링
모던 자바스크립트 Deep Dive | 36장 | 디스트럭처링
브라우저의 렌더링 과정
모던 자바스크립트 Deep Dive | 38장 | 브라우저의 렌더링 과정
스프레드 문법
모던 자바스크립트 Deep Dive | 35장 | 스프레드 문법
이터러블
모던 자바스크립트 Deep Dive | 34장 | 이터러블
7번째 데이터 타입 Symbol
모던 자바스크립트 Deep Dive | 33장 | 7번째 데이터 타입 Symbol
String
모던 자바스크립트 Deep Dive | 32장 | String
RegExp
모던 자바스크립트 Deep Dive | 31장 | RegExp
Date
모던 자바스크립트 Deep Dive | 30장 | Date
Math
모던 자바스크립트 Deep Dive | 29장 | Math
DOM
모던 자바스크립트 Deep Dive | 39장 | DOM
Number
모던 자바스크립트 Deep Dive | 28장 | Number
배열
모던 자바스크립트 Deep Dive | 27장 | 배열
이벤트
모던 자바스크립트 Deep Dive | 40장 | 이벤트
ES6 함수의 추가 기능
모던 자바스크립트 Deep Dive | 26장 | ES6 함수의 추가 기능
클래스
모던 자바스크립트 Deep Dive | 25장 | 클래스
this
모던 자바스크립트 Deep Dive | 22장 | this
빌트인 객체
모던 자바스크립트 Deep Dive | 21장 | 빌트인 객체
strict mode
모던 자바스크립트 Deep Dive | 20장 | strict mode
클로저
모던 자바스크립트 Deep Dive | 24장 | 클로저
프로토타입
모던 자바스크립트 Deep Dive | 19장 | 프로토타입
함수와 일급 객체
모던 자바스크립트 Deep Dive | 18장 | 함수와 일급 객체
실행 컨텍스트
모던 자바스크립트 Deep Dive | 23장 | 실행 컨텍스트
생성자 함수에 의한 객체 생성
모던 자바스크립트 Deep Dive | 17장 | 생성자 함수에 의한 객체 생성
프로퍼티 어트리뷰트
모던 자바스크립트 Deep Dive | 16장 | 프로퍼티 어트리뷰트
let, const 키워드와 블록 레벨 스코프
모던 자바스크립트 Deep Dive | 15장 | let, const 키워드와 블록 레벨 스코프
전역 변수의 문제점
모던 자바스크립트 Deep Dive | 14장 | 전역 변수의 문제점
스코프
모던 자바스크립트 Deep Dive | 13장 | 스코프
함수
모던 자바스크립트 Deep Dive | 12장 | 함수
원시 값과 객체의 비교
모던 자바스크립트 Deep Dive | 11장 | 원시 값과 객체의 비교
객체 리터럴
모던 자바스크립트 Deep Dive | 10장 | 객체 리터럴
타입 변환과 단축 평가
모던 자바스크립트 Deep Dive | 9장 | 타입 변환과 단축 평가
제어문
모던 자바스크립트 Deep Dive | 8장 | 제어문
연산자
모던 자바스크립트 Deep Dive | 7장 | 연산자
데이터 타입
모던 자바스크립트 Deep Dive | 6장 | 데이터 타입
표현식과 문
모던 자바스크립트 Deep Dive | 5장 | 표현식과 문
변수
모던 자바스크립트 Deep Dive | 4장 | 변수
Iteration와 Generator
코드스피츠 77 ES6+ 3화 참조
WHATWG 탄생 배경
WHATWG, W3C, HTML의 관련에 대한 역사
프론트엔드(FE) 면접 질문 정리
FE관련 면접 질문 및 답변 정리한 내용입니다.
쿠버네티스(kubernetes, k8s) 용어 정리
쿠버네티스(kubernetes, k8s) 용어 정리
젠킨스(Jenkins) 정리
젠킨스(Jenkins) 정리
Docker 용어 정리
Docker 용어 정리
Git 용어 정리
Git 용어 정리
반응형 웹 디자인(Responsive Web Design)
CSS responsive 에 대하여
JS this에 대하여
this에 대해 알아보자
SQL*PLUS에 대하여
SQL*PLUS 정의 및 사용방법
Oracle에서 SQL Plan 확인하기
Oracle에서 SQL Plan을 확인해보자