메뉴 닫기

파이썬 Selenium 멀티탭과 팝업 동기화 window_handles 활용법

파이썬 Selenium 멀티탭과 팝업 동기화 window_handles 활용법

🚀 실전 자동화에서 필수로 알아야 할 멀티탭 처리와 EC.number_of_windows_to_be 활용법

파이썬으로 웹 자동화를 진행하다 보면 하나의 창만 다루는 경우보다는, 여러 개의 탭이나 팝업을 동시에 관리해야 하는 상황이 자주 발생합니다.
특히 로그인 후 팝업이 뜨거나 새로운 링크가 다른 탭에서 열릴 때는, 창 전환과 동기화 문제가 따라오죠.
이때 아무런 대기 처리 없이 코드를 작성하면 스크립트가 원하는 창을 찾지 못하거나, 아직 열리지 않은 창에 접근하려고 시도하면서 에러가 발생하기 쉽습니다.
이런 문제를 해결하기 위해 Selenium은 window_handles 속성과 expected_conditions.number_of_windows_to_be 같은 강력한 기능을 제공합니다.

이 글에서는 멀티탭과 팝업을 효과적으로 다루는 방법을 체계적으로 정리해 드립니다.
기본 개념부터, 실전에서 어떻게 응용할 수 있는지, 또 자주 마주치는 실수와 해결책까지 알려드릴 예정이에요.
Selenium을 조금 더 안정적이고 스마트하게 활용하고 싶다면 꼭 끝까지 읽어보세요.



🖥️ 멀티탭과 팝업이 자동화에서 중요한 이유

웹 자동화 테스트나 크롤링을 진행하다 보면, 단일 창에서 모든 작업이 끝나는 경우는 드뭅니다.
로그인 후 인증 팝업이 뜨거나, 새로운 링크 클릭 시 자동으로 다른 탭이 열리는 상황이 빈번히 발생하죠.
만약 이런 상황을 제대로 처리하지 못하면 테스트 시나리오가 중단되거나, 원하는 데이터를 가져오지 못하는 문제가 생깁니다.

멀티탭과 팝업은 단순히 부가적인 요소가 아니라, 실제 서비스 사용 흐름의 일부입니다.
예를 들어 결제 창, 광고 팝업, 소셜 로그인 인증 페이지 등은 사용자 경험에 필수적으로 포함되며, 자동화 과정에서도 반드시 고려해야 하는 요소입니다.
Selenium을 활용할 때 이런 창 전환 과정을 제대로 다루는 능력은 단순한 스크립트 작성 능력을 넘어 안정적인 자동화 환경을 구축하는 핵심 역량이라고 할 수 있습니다.

🌐 멀티탭 제어가 필요한 대표적인 사례

  • 🛒쇼핑몰 결제 과정에서 새로운 결제 팝업 창 제어
  • 🔑구글, 네이버, 카카오 등 소셜 로그인 인증 페이지 이동
  • 📄문서 다운로드 시 생성되는 새로운 탭이나 임시 창
  • 📢광고 배너 클릭 시 열리는 추가 창 또는 팝업

이처럼 다양한 케이스에서 멀티탭과 팝업을 제어하지 못하면, 전체 프로세스가 끊기거나 데이터가 누락될 수 있습니다.
따라서 Selenium에서 제공하는 window_handles를 이해하고, 탭 수 변화에 맞춰 대기 조건을 적절히 활용하는 것이 매우 중요합니다.

🔑 window_handles 기본 동작 원리

Selenium에서 window_handles는 현재 브라우저에서 열린 모든 창(윈도우나 탭)의 핸들을 리스트 형태로 반환합니다.
각 창은 고유한 식별자를 가지고 있으며, 이 핸들을 통해 원하는 창으로 자유롭게 전환할 수 있습니다.
즉, 브라우저가 여러 개의 창을 관리할 때 개발자가 어떤 창을 다루고 있는지 명확하게 지정할 수 있게 도와주는 핵심 기능입니다.

일반적으로 driver.current_window_handle은 현재 활성화된 창의 핸들을 반환하고,
driver.window_handles는 모든 창의 핸들을 리스트로 제공합니다.
이를 활용하면 새로운 탭이 열릴 때 리스트 길이가 변하는 것을 감지하고, 새로 생성된 창으로 제어권을 넘길 수 있습니다.

🔍 window_handles 사용 예시

CODE BLOCK
# 현재 창 핸들 확인
main_handle = driver.current_window_handle

# 새로운 탭이 열렸다고 가정
all_handles = driver.window_handles

# 새로운 창으로 전환
for handle in all_handles:
    if handle != main_handle:
        driver.switch_to.window(handle)
        break

위 예제는 기본적으로 현재 창을 저장해 두고,
새로운 창이 열렸을 때 다른 핸들을 찾아 전환하는 방식입니다.
실전에서는 이런 과정을 명시적인 대기 조건과 함께 사용해야 안정적으로 동작합니다.

⚠️ 놓치기 쉬운 부분

⚠️ 주의: 단순히 window_handles를 읽어오는 것만으로는
창이 완전히 로드되었는지 알 수 없습니다.
탭은 열렸지만 DOM이 준비되지 않은 상태라면,
바로 요소를 찾을 때 NoSuchElementException이 발생할 수 있으니,
반드시 대기 조건과 함께 사용해야 합니다.



EC.number_of_windows_to_be 활용법

Selenium의 expected_conditions 모듈에는
창의 개수를 특정 숫자가 될 때까지 기다리는 number_of_windows_to_be 조건이 포함되어 있습니다.
이 기능은 멀티탭 환경에서 창이 완전히 열릴 때까지 기다린 뒤 안전하게 제어를 넘기는 데 유용합니다.

단순히 time.sleep()으로 기다리는 방식은 불필요하게 시간을 낭비하거나,
네트워크 환경에 따라 불안정할 수 있습니다.
반면 EC.number_of_windows_to_be는 창 개수를 기준으로 대기하기 때문에,
조건이 만족되는 즉시 실행이 이어져 더 효율적이고 안정적입니다.

✅ 사용 예제

CODE BLOCK
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 새 창이 열릴 때까지 대기 (총 창 개수가 2개가 될 때까지)
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))

# 새로 열린 창 핸들로 전환
new_window = [handle for handle in driver.window_handles if handle != main_handle][0]
driver.switch_to.window(new_window)

위 코드에서는 총 창 개수가 2개가 될 때까지 대기한 뒤,
기존 창을 제외한 새로운 창의 핸들을 찾아 전환합니다.
이 과정을 통해 스크립트가 창 로딩 문제로 멈추거나 실패하는 상황을 예방할 수 있습니다.

💡 활용 팁

💡 TIP: 창이 3개 이상 열리는 경우라면 EC.number_of_windows_to_be(3)와 같이 원하는 숫자를 지정할 수 있습니다.
또한, EC 조건을 WebDriverWait과 함께 사용하면 다양한 상황에서도 안정적인 멀티탭 제어가 가능합니다.

⚙️ 멀티탭 전환과 팝업 제어 실전 예제

이제까지 살펴본 window_handlesEC.number_of_windows_to_be를 실전에서 어떻게 활용할 수 있는지 예제를 통해 알아보겠습니다.
아래 코드는 사용자가 버튼을 클릭했을 때 새로운 탭이 열리고,
그 탭에서 원하는 작업을 처리한 뒤 다시 원래 창으로 돌아오는 과정을 보여줍니다.

CODE BLOCK
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

main_handle = driver.current_window_handle

# 버튼 클릭으로 새 탭 열기
driver.find_element(By.ID, "newTabBtn").click()

# 창 개수가 2개가 될 때까지 대기
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))

# 새로운 창으로 전환
for handle in driver.window_handles:
    if handle != main_handle:
        driver.switch_to.window(handle)
        break

# 새 탭에서 원하는 작업 수행
driver.get("https://example.com")

# 다시 원래 창으로 전환
driver.switch_to.window(main_handle)

이 패턴은 결제 프로세스, 파일 다운로드, 로그인 인증 등 다양한 상황에서 활용할 수 있습니다.
핵심은 반드시 창의 개수가 늘어나는 순간을 정확히 기다린 뒤, 제어할 핸들을 올바르게 선택하는 것입니다.

📌 팝업 창 제어하기

팝업 창은 일반적인 새 탭과 비슷하게 동작하지만,
경우에 따라 브라우저 보안 설정이나 프레임 구조 때문에 다소 까다로울 수 있습니다.
이럴 때는 팝업이 열리는 순간을 number_of_windows_to_be로 기다린 후,
팝업 창 핸들을 찾아 전환하면 문제를 쉽게 해결할 수 있습니다.

💎 핵심 포인트:
멀티탭과 팝업 제어는 단순히 핸들 전환만의 문제가 아니라, 대기 조건올바른 시점 제어가 함께 이루어져야 성공적으로 동작합니다.



🚩 자주 발생하는 문제와 해결 방법

멀티탭과 팝업을 제어하는 과정에서 개발자들이 흔히 겪는 문제들이 있습니다.
이 부분을 미리 알고 대비하면 불필요한 시행착오를 크게 줄일 수 있습니다.

⚠️ 빈번한 에러와 원인

문제 상황 원인
NoSuchWindowException 이미 닫힌 창을 참조하거나, 존재하지 않는 핸들에 접근
NoSuchElementException 새 창은 떴지만 DOM이 완전히 로드되지 않은 상태에서 요소 접근
TimeoutException number_of_windows_to_be 조건이 시간 내 충족되지 못한 경우

🛠️ 해결 방법 체크리스트

  • WebDriverWaitEC.number_of_windows_to_be로 동기화 처리
  • 🔄작업 후 반드시 원래 창으로 switch_to.window()를 통해 복귀
  • 🧹테스트 완료 후 불필요한 탭은 닫아 리소스 낭비 방지
  • 🔍창이 열리는 시점과 요소가 로드되는 시점을 혼동하지 말고 별도로 확인

결국 멀티탭 제어의 핵심은 정확한 시점 관리입니다.
창의 개수 변화는 EC 조건으로,
요소 탐색은 별도의 Explicit Wait으로 나누어 관리해야 안정적인 자동화가 가능합니다.

자주 묻는 질문 (FAQ)

window_handles와 current_window_handle의 차이는 무엇인가요?
window_handles는 모든 창의 핸들을 리스트로 반환하고, current_window_handle은 현재 활성화된 창 하나의 핸들만 반환합니다.
팝업 창도 window_handles로 제어할 수 있나요?
네, 팝업도 별도의 윈도우로 인식되므로 window_handles 목록에 포함되며 동일한 방식으로 전환할 수 있습니다.
number_of_windows_to_be 조건이 필요한 이유는 무엇인가요?
단순한 시간 지연이 아닌, 실제 창 개수가 원하는 값이 될 때까지 기다려 안정적인 제어를 보장하기 위해 필요합니다.
여러 개의 새 탭이 동시에 열리면 어떻게 처리하나요?
EC.number_of_windows_to_be로 원하는 창 개수만큼 기다린 후, window_handles 리스트를 순회하며 필요한 탭으로 전환하면 됩니다.
작업 후 다시 원래 창으로 돌아오는 방법은?
초기 current_window_handle을 저장해 두고, 작업이 끝난 뒤 driver.switch_to.window()를 사용하면 원래 창으로 쉽게 복귀할 수 있습니다.
팝업을 닫아야 하는 경우는 어떻게 하나요?
driver.close()로 현재 활성화된 창만 닫을 수 있으며, 이후 driver.switch_to.window()로 제어를 다른 창으로 넘겨야 합니다.
탭 전환 시 요소가 로드되지 않는 문제를 어떻게 해결하나요?
WebDriverWait과 Expected Conditions의 presence_of_element_located 같은 조건을 함께 사용해야 안정적으로 요소를 탐색할 수 있습니다.
멀티탭 제어에서 가장 중요한 핵심은 무엇인가요?
창 개수 변화에 따른 정확한 대기와, 작업 후 원래 창으로 돌아오는 제어 흐름을 반드시 지켜야 안정적인 자동화가 가능합니다.

📝 안정적인 멀티탭·팝업 자동화를 위한 핵심 정리

파이썬 Selenium을 활용해 멀티탭과 팝업을 제어하는 과정은 단순히 window_handles로 전환하는 것만으로는 부족합니다.
창이 열리는 시점과 DOM이 로드되는 시점을 혼동하면 예외가 발생하기 쉽고, 그로 인해 전체 테스트 흐름이 끊길 수 있습니다.
따라서 EC.number_of_windows_to_be 같은 명시적 대기 조건을 적절히 활용하고, 작업 후 반드시 원래 창으로 복귀하는 습관을 들이는 것이 중요합니다.

특히 결제, 로그인 인증, 파일 다운로드와 같이 사용자 경험과 직결되는 시나리오에서는 더욱 꼼꼼한 제어가 필요합니다.
이 글에서 다룬 원리와 실전 예제를 토대로 멀티탭 환경에서도 안정적이고 확실한 자동화를 구현해 보시길 바랍니다.


🏷️ 관련 태그 : 파이썬자동화, Selenium, 멀티탭제어, 팝업처리, window_handles, ExpectedConditions, number_of_windows_to_be, 웹테스트자동화, 파이썬프로그래밍, QA자동화