목차
타임아웃 예외란 무엇이며 왜 발생하는가
SeleniumBasic을 사용하여 웹 자동화 스크립트를 작성하다 보면 '타임아웃 예외(Timeout Exception)'에 직면하는 경우가 많습니다. 이 예외는 특정 요소가 나타나기를 기다리거나, 특정 동작이 완료되기를 기다리는 과정에서 지정된 시간 내에 원하는 결과가 나오지 않았을 때 발생합니다. 예를 들어, 웹 페이지가 로딩되는 시간이 예상보다 오래 걸리거나, 버튼 클릭 후 새로운 페이지가 나타나기까지 지연될 때 흔히 경험할 수 있습니다. 이는 자동화 스크립트가 예상대로 동작하지 않고 중단되는 주요 원인 중 하나입니다. 타임아웃 예외는 웹 자동화에서 가장 흔하게 발생하는 문제 중 하나로, 이를 제대로 이해하고 해결하는 것이 중요합니다.
이러한 예외가 발생하는 근본적인 이유는 웹 페이지의 동적인 특성 때문입니다. 인터넷 환경의 속도, 서버 응답 시간, JavaScript의 실행 속도 등 다양한 요인이 웹 페이지 로딩 및 상호작용 시간에 영향을 미칩니다. 따라서 스크립트가 예상하는 시간 안에 요소가 준비되지 않으면, Selenium은 더 이상 기다릴 수 없어 예외를 발생시키고 실행을 중단하게 됩니다.
아래 표는 타임아웃 예외 발생 가능성이 높은 시나리오를 정리한 것입니다.
| 상황 | 예외 발생 원인 |
|---|---|
| 페이지 로딩 지연 | 느린 네트워크 속도, 복잡한 페이지 구조 |
| 특정 요소 로딩 지연 | JavaScript로 동적으로 로드되는 요소 |
| 동작 완료 대기 | 버튼 클릭 후 다음 단계 진행까지 시간이 걸리는 경우 |

SeleniumBasic 타임아웃 설정 및 조정 방법
SeleniumBasic에서 타임아웃을 관리하는 가장 기본적인 방법은 SetTimeout 함수를 사용하는 것입니다. 이 함수를 통해 웹 드라이버가 특정 동작을 기다리는 최대 시간을 설정할 수 있습니다. 기본적으로 Selenium은 짧은 시간 동안만 대기하므로, 예상보다 시간이 더 걸리는 상황에 대비하여 이 값을 충분히 길게 설정하는 것이 좋습니다. 예를 들어, SetTimeout("Page Load", 60000)은 페이지 로딩에 최대 60초(60000밀리초)를 허용하겠다는 의미입니다.
이 외에도 특정 요소가 나타나기를 기다릴 때 사용할 수 있는 FindElement 메서드에 대한 타임아웃을 별도로 설정하는 것이 효율적입니다. 만약 `FindElement` 메서드에 대한 타임아웃 설정이 명시되지 않으면, 전역적인 페이지 로딩 타임아웃 설정이 적용될 수 있습니다. 각 메서드별 타임아웃 설정을 적절히 조합하여 사용하면 스크립트의 안정성을 크게 높일 수 있습니다. 타임아웃 값을 설정할 때는 단순히 값을 늘리는 것 이상으로, 스크립트가 실행될 환경과 웹 페이지의 일반적인 응답 속도를 고려해야 합니다.
타임아웃 설정을 위한 일반적인 절차는 다음과 같습니다.
▶ 1단계: 전역 페이지 로딩 타임아웃 설정
▶ 2단계: 특정 요소 탐색(FindElement)에 대한 타임아웃 설정
▶ 3단계: 필요에 따라 각 동작별 대기 시간(Wait)을 명시적으로 추가

효과적인 타임아웃 예외 처리 기법
단순히 타임아웃 시간을 늘리는 것만으로는 모든 문제를 해결할 수 없습니다. 때로는 예상치 못한 오류로 인해 스크립트가 영원히 기다릴 수 있으므로, 예외 처리 메커니즘을 적용하는 것이 매우 중요합니다. 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`로 현재 페이지 주소를 파악하면 문제의 원인을 빠르고 정확하게 분석하는 데 큰 도움이 됩니다.