본문 바로가기

SeleniumBasic 타임아웃 예외 쉽게 해결하기

@언더시티2025. 12. 17. 06:53




타임아웃 예외란 무엇이며 왜 발생하는가

SeleniumBasic을 사용하여 웹 자동화 스크립트를 작성하다 보면 '타임아웃 예외(Timeout Exception)'에 직면하는 경우가 많습니다. 이 예외는 특정 요소가 나타나기를 기다리거나, 특정 동작이 완료되기를 기다리는 과정에서 지정된 시간 내에 원하는 결과가 나오지 않았을 때 발생합니다. 예를 들어, 웹 페이지가 로딩되는 시간이 예상보다 오래 걸리거나, 버튼 클릭 후 새로운 페이지가 나타나기까지 지연될 때 흔히 경험할 수 있습니다. 이는 자동화 스크립트가 예상대로 동작하지 않고 중단되는 주요 원인 중 하나입니다. 타임아웃 예외는 웹 자동화에서 가장 흔하게 발생하는 문제 중 하나로, 이를 제대로 이해하고 해결하는 것이 중요합니다.

이러한 예외가 발생하는 근본적인 이유는 웹 페이지의 동적인 특성 때문입니다. 인터넷 환경의 속도, 서버 응답 시간, JavaScript의 실행 속도 등 다양한 요인이 웹 페이지 로딩 및 상호작용 시간에 영향을 미칩니다. 따라서 스크립트가 예상하는 시간 안에 요소가 준비되지 않으면, Selenium은 더 이상 기다릴 수 없어 예외를 발생시키고 실행을 중단하게 됩니다.

아래 표는 타임아웃 예외 발생 가능성이 높은 시나리오를 정리한 것입니다.

 

상황 예외 발생 원인
페이지 로딩 지연 느린 네트워크 속도, 복잡한 페이지 구조
특정 요소 로딩 지연 JavaScript로 동적으로 로드되는 요소
동작 완료 대기 버튼 클릭 후 다음 단계 진행까지 시간이 걸리는 경우

SeleniumBasic 타임아웃 예외 쉽게 해결하기




SeleniumBasic 타임아웃 설정 및 조정 방법

SeleniumBasic에서 타임아웃을 관리하는 가장 기본적인 방법은 SetTimeout 함수를 사용하는 것입니다. 이 함수를 통해 웹 드라이버가 특정 동작을 기다리는 최대 시간을 설정할 수 있습니다. 기본적으로 Selenium은 짧은 시간 동안만 대기하므로, 예상보다 시간이 더 걸리는 상황에 대비하여 이 값을 충분히 길게 설정하는 것이 좋습니다. 예를 들어, SetTimeout("Page Load", 60000)은 페이지 로딩에 최대 60초(60000밀리초)를 허용하겠다는 의미입니다.

이 외에도 특정 요소가 나타나기를 기다릴 때 사용할 수 있는 FindElement 메서드에 대한 타임아웃을 별도로 설정하는 것이 효율적입니다. 만약 `FindElement` 메서드에 대한 타임아웃 설정이 명시되지 않으면, 전역적인 페이지 로딩 타임아웃 설정이 적용될 수 있습니다. 각 메서드별 타임아웃 설정을 적절히 조합하여 사용하면 스크립트의 안정성을 크게 높일 수 있습니다. 타임아웃 값을 설정할 때는 단순히 값을 늘리는 것 이상으로, 스크립트가 실행될 환경과 웹 페이지의 일반적인 응답 속도를 고려해야 합니다.

타임아웃 설정을 위한 일반적인 절차는 다음과 같습니다.

 

▶ 1단계: 전역 페이지 로딩 타임아웃 설정

▶ 2단계: 특정 요소 탐색(FindElement)에 대한 타임아웃 설정

▶ 3단계: 필요에 따라 각 동작별 대기 시간(Wait)을 명시적으로 추가

SeleniumBasic 타임아웃 예외 쉽게 해결하기




효과적인 타임아웃 예외 처리 기법

단순히 타임아웃 시간을 늘리는 것만으로는 모든 문제를 해결할 수 없습니다. 때로는 예상치 못한 오류로 인해 스크립트가 영원히 기다릴 수 있으므로, 예외 처리 메커니즘을 적용하는 것이 매우 중요합니다. SeleniumBasic에서는 On Error Resume Next 구문을 사용하여 오류 발생 시에도 스크립트가 중단되지 않고 다음 코드를 계속 실행하도록 할 수 있습니다. 하지만 이 구문은 모든 종류의 오류를 무시하므로, 특정 타임아웃 예외만을 잡아내어 처리하는 것이 더 정교한 방법입니다.

더 나아가, `On Error GoTo` 레이블을 사용하여 특정 오류 발생 시 별도의 예외 처리 루틴으로 이동하도록 구현할 수 있습니다. 예를 들어, `FindElement`가 타임아웃될 경우, 로그를 기록하거나 사용자에게 알림을 보내고, 다른 대안을 시도하는 등의 작업을 수행할 수 있습니다. 이를 통해 스크립트의 견고성을 높이고, 예상치 못한 상황에서도 gracefully하게 대처할 수 있습니다.

효과적인 예외 처리를 위한 몇 가지 팁은 다음과 같습니다.

 

핵심 포인트: 타임아웃 예외 발생 시 스크립트가 비정상적으로 종료되는 것을 방지하고, 필요한 후속 조치를 취할 수 있도록 try-catch 또는 On Error GoTo 구문을 활용하세요.

처리 방법 설명
SetTimeout 조정 기본 타임아웃 값을 늘려 문제 완화
On Error Resume Next 오류 발생 시 다음 코드로 진행 (신중하게 사용)
On Error GoTo 특정 오류 발생 시 별도 처리 루틴으로 이동 (권장)




타임아웃 발생 시 기본 동작과 설정 옵션 이해하기

SeleniumBasic을 사용하여 웹 자동화를 진행하다 보면 '타임아웃' 오류는 매우 흔하게 마주치는 문제입니다. 이는 웹 페이지의 요소가 예상한 시간 안에 로드되지 않았을 때 발생하며, 자동화 스크립트의 흐름을 방해하는 주된 원인 중 하나입니다. SeleniumBasic은 이러한 타임아웃 상황에 대처하기 위한 여러 설정 옵션을 제공합니다. 기본적으로 SeleniumBasic은 특정 요소가 화면에 나타날 때까지 기다리는 '암묵적 대기(Implicit Wait)'와 특정 조건이 만족될 때까지 기다리는 '명시적 대기(Explicit Wait)'를 활용합니다. 이 두 가지 대기 방식의 차이점과 각각의 설정 방법을 명확히 이해하는 것이 타임아웃 예외 처리를 위한 첫걸음입니다. 특히, 암묵적 대기는 브라우저 세션이 시작될 때 한 번만 설정하며, 이후 모든 요소 탐색에 일괄적으로 적용된다는 특징이 있습니다. 반면, 명시적 대기는 특정 요소나 조건에 대해 필요할 때만 지정하여 사용할 수 있어 더욱 유연하고 세밀한 제어가 가능합니다. 이러한 기본 동작 방식을 숙지하고 상황에 맞게 적절한 설정을 적용하는 것이 중요합니다.

타임아웃 설정을 이해하는 것은 스크립트의 안정성을 높이는 데 결정적인 역할을 합니다. 잘못된 대기 시간 설정은 불필요한 스크립트 실패로 이어질 수 있으며, 반대로 너무 길게 설정하면 테스트 실행 시간이 늘어나 비효율을 초래할 수 있습니다. 따라서 각 설정 옵션의 의미와 적용 범위를 정확히 파악하고, 웹 애플리케이션의 특성에 맞게 최적의 값을 찾아가는 과정이 필요합니다.

 

대기 방식 설명 주요 특징
암묵적 대기 요소를 찾을 때 지정된 시간만큼 자동으로 기다립니다. 세션 시작 시 한 번 설정, 모든 요소 탐색에 적용. 유연성 낮음.
명시적 대기 특정 조건(예: 요소 존재, 클릭 가능 상태)이 만족될 때까지 기다립니다. 필요한 지점에 지정, 특정 조건에만 적용. 유연성 높음.




명시적 대기를 활용한 정확한 예외 처리 방법

타임아웃 예외를 가장 효과적으로 처리하는 방법 중 하나는 '명시적 대기(Explicit Wait)'를 사용하는 것입니다. 이는 특정 조건이 충족될 때까지 기다리도록 코드를 작성하는 방식입니다. SeleniumBasic에서는 `WebDriverWait` 클래스를 사용하여 이를 구현할 수 있습니다. 이 클래스는 지정된 최대 대기 시간 동안 주기적으로 조건을 확인하며, 조건이 만족되면 즉시 다음 코드를 실행합니다. 만약 지정된 시간 안에 조건이 만족되지 않으면 `TimeoutException`이 발생합니다.

명시적 대기를 사용할 때 핵심은 '기대 조건(Expected Conditions)'을 적절히 활용하는 것입니다. 예를 들어, 특정 요소가 화면에 나타날 때까지 기다리거나, 요소가 클릭 가능한 상태가 될 때까지 기다리는 등의 조건을 정의할 수 있습니다. 이를 통해 스크립트는 불필요하게 대기하는 시간을 줄이고, 정말로 필요한 순간에만 정확하게 기다리게 되어 안정적인 자동화를 구현할 수 있습니다. 타임아웃 예외가 발생할 만한 특정 시점에서 명시적 대기를 사용하면, 예외 발생 가능성을 현저히 낮출 수 있습니다.

예를 들어, 새로운 페이지로 이동한 후 특정 버튼이 나타나기를 기다리는 상황을 생각해 보겠습니다. 이때 암묵적 대기만으로는 페이지 로딩이 다소 느릴 경우에도 타임아웃이 발생할 수 있습니다. 하지만 명시적 대기를 사용하여 '버튼이 존재하고 클릭 가능한 상태가 될 때까지 최대 10초간 기다리세요'라고 명확히 지정하면, 해당 조건이 만족되는 즉시 다음 단계로 넘어가므로 효율적입니다.

 

핵심 포인트: 명시적 대기는 `WebDriverWait`와 `ExpectedConditions`를 함께 사용하여 특정 상황에서만 기다리게 함으로써 타임아웃 예외를 효과적으로 관리합니다.

▶ 1단계: `WebDriverWait` 객체 생성. `driver` 객체와 최대 대기 시간을 인자로 전달합니다. (예: `WebDriverWait(driver, 10)`)

▶ 2단계: `until` 메서드를 사용하여 명시할 조건을 전달합니다. `ExpectedConditions` 모듈의 다양한 메서드를 활용합니다. (예: `EC.presence_of_element_located((By.ID, "element_id"))`)

▶ 3단계: 조건이 충족되면 해당 요소 또는 True/False 값을 반환받습니다. 시간이 초과되면 `TimeoutException`이 발생합니다.




try-except 구문을 활용한 타임아웃 예외 처리 패턴

명시적 대기를 사용하더라도 때로는 예측하지 못한 상황으로 인해 타임아웃이 발생할 수 있습니다. 이러한 예외 상황에 더욱 견고하게 대처하기 위해 파이썬의 `try-except` 구문을 활용하는 것이 일반적입니다. `try` 블록 안에 타임아웃이 발생할 수 있는 Selenium 코드를 넣고, `except TimeoutException` 블록에서 해당 예외를 잡아서 처리하는 패턴입니다. 이를 통해 스크립트가 중단되지 않고, 예외 발생 시 로그를 남기거나 대체 액션을 수행하는 등의 추가적인 처리를 할 수 있습니다.

이 패턴은 코드의 **견고성**을 크게 향상시킵니다. 예를 들어, 특정 요소가 나타나지 않거나 페이지가 예상보다 훨씬 느리게 로딩되는 경우, `try-except` 구문 덕분에 스크립트는 에러 메시지를 출력하고 종료하는 대신, "요소를 찾지 못했습니다. 다음 단계를 진행합니다."와 같은 메시지를 출력하고 다른 방식으로 문제를 처리하거나, 사용자에게 알림을 보내는 등의 작업을 수행할 수 있습니다.

`try-except` 구문과 명시적 대기를 결합하면 가장 이상적인 타임아웃 예외 처리 전략을 구축할 수 있습니다. 명시적 대기로 최대한 타임아웃 발생을 억제하고, 혹시 모를 예외 상황은 `try-except` 구문으로 안정적으로 처리하는 것입니다. 이를 통해 반복 실행되는 자동화 작업의 신뢰도를 높일 수 있습니다.

 

핵심 요약

• 타임아웃 예외는 Selenium 자동화에서 흔하게 발생하지만, 명시적 대기와 try-except 구문을 통해 효과적으로 관리할 수 있습니다.
• 명시적 대기는 `WebDriverWait`와 `ExpectedConditions`를 활용하여 특정 조건이 만족될 때까지 기다리는 방식입니다.
• try-except 구문은 발생 가능한 `TimeoutException`을 포착하여 스크립트가 중단되지 않고 오류를 처리하도록 합니다.
• 이 두 가지 기법을 조합하여 안정적이고 신뢰성 높은 웹 자동화 스크립트를 구축하세요.




주요 질문 FAQ




Q. SeleniumBasic에서 'Element not found after N seconds' 타임아웃 오류가 발생하는 이유는 무엇인가요?

이 오류는 SeleniumBasic이 특정 웹 요소(예: 버튼, 입력 필드)를 찾으려고 시도했지만, 지정된 시간(기본값은 30초) 안에 해당 요소를 발견하지 못했을 때 발생합니다. 웹 페이지 로딩 속도가 느리거나, 요소의 DOM 구조가 예상과 다르거나, 자바스크립트로 인해 동적으로 로드되는 요소가 제때 나타나지 않는 경우에 흔히 나타납니다.




Q. 타임아웃 시간을 더 짧거나 길게 설정하는 방법은 무엇인가요?

SeleniumBasic에서는 `IE.Timeout` 속성을 사용하여 검색 타임아웃 시간을 조절할 수 있습니다. 예를 들어, 타임아웃을 10초로 설정하려면 `IE.Timeout = 10` 와 같이 코드를 작성하면 됩니다. 이 값을 늘리면 페이지 로딩이 느린 경우 오류를 방지할 수 있고, 줄이면 스크립트 실행 속도를 높일 수 있습니다.




Q. 특정 요소가 로드될 때까지 기다리는 '명시적 대기(Explicit Wait)'를 사용하는 방법이 있나요?

네, `IE.WaitForComplete` 함수를 사용하여 페이지 로딩이 완료될 때까지 기다릴 수 있습니다. 또한, `IE.FindById`, `IE.FindByClass` 등의 메서드 앞에 `IE.SetTimeOut`으로 원하는 대기 시간을 설정하면 해당 요소가 나타날 때까지 지정된 시간만큼 기다립니다. 하지만 동적으로 나타나는 특정 요소에 대한 보다 세밀한 대기가 필요하다면, VBA의 `Do While` 루프와 `DoEvents`를 활용하여 특정 조건이 만족될 때까지 반복적으로 확인하는 커스텀 대기 함수를 구현하는 것이 좋습니다.




Q. 요소가 없거나 로드되지 않았을 때 오류 발생을 막고 다음 코드를 계속 실행하려면 어떻게 해야 하나요?

`On Error Resume Next` 구문을 사용하여 오류 발생 시 스크립트가 중단되지 않고 다음 줄로 넘어가도록 설정할 수 있습니다. 하지만 이 방법을 사용하면 예상치 못한 다른 오류까지 무시될 수 있으므로, 오류 발생 후 `On Error GoTo 0`으로 복구하거나 `Err` 객체를 통해 실제 발생한 오류 코드를 확인하여 특정 오류에 대해서만 예외 처리를 하는 것이 안전합니다.




Q. `IE.FindById` 같은 메서드에서 발생하는 타임아웃 예외를 Try-Catch와 유사하게 처리할 수 있나요?

VBA에는 Python이나 C#과 같은 직접적인 Try-Catch 블록은 없습니다. 하지만 `On Error Resume Next`와 `On Error GoTo 0`을 조합하여 유사하게 구현할 수 있습니다. 예를 들어, 특정 메서드 실행 전에 `On Error Resume Next`를 선언하고, 메서드 실행 후 `If Err.Number <> 0 Then` 조건을 통해 오류 발생 여부를 확인하고 원하는 처리를 수행한 뒤 `On Error GoTo 0`으로 되돌리는 방식입니다.




Q. 특정 요소의 존재 여부를 먼저 확인하고 스크립트를 진행하는 방법은?

`IE.IsElementPresent()`와 같은 메서드는 지원되지 않으므로, 직접적인 존재 확인 함수는 없습니다. 하지만 `On Error Resume Next`를 사용하여 요소를 찾으려고 시도하고, `If Err.Number = 0 Then` (오류가 발생하지 않았으면) 코드를 실행하는 방식으로 요소의 존재 여부를 간접적으로 확인할 수 있습니다. 이 방법을 통해 요소를 찾았을 때만 해당 요소를 조작하는 코드를 실행하도록 할 수 있습니다.




Q. 웹 페이지가 여러 프레임으로 구성되어 있을 때 타임아웃 문제를 어떻게 해결해야 하나요?

프레임 내의 요소를 찾을 때는 해당 프레임으로 전환하는 과정이 필요합니다. `IE.FrameName()` 또는 `IE.FrameById()` 등을 사용하여 올바른 프레임으로 이동한 후, 해당 프레임 안에서 요소를 찾아야 합니다. 각 프레임 전환 시에도 타임아웃이 발생할 수 있으므로, `IE.Timeout` 설정과 `On Error Resume Next`를 함께 활용하여 오류 처리를 강화하는 것이 중요합니다.




Q. 타임아웃 예외 처리를 할 때, 어떤 부분을 로깅(기록)하는 것이 도움이 되나요?

타임아웃 예외 발생 시, 오류가 발생한 코드 라인 번호, 시도했던 요소의 식별자(ID, ClassName 등), 현재 URL, 설정된 타임아웃 값 등을 로깅하는 것이 디버깅에 매우 유용합니다. `Err.Number`와 `Err.Description`을 활용하여 오류 정보를 기록하고, `IE.LocationURL`로 현재 페이지 주소를 파악하면 문제의 원인을 빠르고 정확하게 분석하는 데 큰 도움이 됩니다.

언더시티
@언더시티

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차