셀레니움을 이용해서 웹브라우저 자동화를 만들때에 예상치 못합 팝업창이 떠서 내가 생각한 자동화 로직이 깨질때가 있습니다. 이럴 때는 팝업창을 감지해서 팝업창을 닫아줘야 합니다. 요즘은 팝업창이 자주 발생하지는 않지만
새로운 팝업창 감지는 WebDriverWait
와 expected_conditions
를 통해서 알 수 있습니다. 해당 기능을 통해서 페이지의 로딩, 경고창 등 역시 감지 할 수 있습니다.
먼저 새로운 팝업을 알아내려면 이전까지의 브라우저 handles
을 알아야 합니다. 팝업이란 것 역시 새로운 창 handle
이기 때문입니다.
browser = webdriver.Chrome(ChromeDriverManager().install())
tabs = browser.window_handles
이렇게 하면 현재 열려있는 브라우저의 탭을 가져올 수 있습니다. tabs는 리스트이며, 현재 탭이 2개라면 2개의 핸들이 들어있게 됩니다.
이렇게 탭이 2개 일 경우 코드를 실행하면 리스트로 된 탭 값을 얻을 수 있습니다.
#이전 까지의 핸들리스트를 넣어준다. 따로 저장을 해두던지 지정한 코드 전에 현재 핸들로 체크한다.
window_handles = browser.window_handles
# ...자동화 코드 실행...
# 팝업이 있는지 체크
new_popup = WebDriverWait(browser, 2).until(EC.new_window_is_opened(window_handles))
새로운 팝업, 탭이 오픈이 된 것은 expected_conditions
을 통해서 알 수 있다고 했습니다. 조건은 new_window_is_opened
입니다. 여기에는 이전 핸들리스트를 넣어주면됩니다. 저는 카페 가입을 하고나서 가입 인사 팝업이 발생하여서 해당 코드를 추가했습니다. 최초에 설정한 핸들 리스트를 저장해두고 코드 실행 후 팝업 체크때 사용했습니다.
current_handle = browser.current_window_handle;
browser.switch_to.window('새로운 팝업 핸들')
browser.close()
browser.switch_to.window(current_handle)
current_window_handle
로 현재 브라우저 핸들을 저장해 두고 팝업의 핸들을 찾아서 전환한 다음 close()
를 실행하여서 종료시킵니다. 그리고 나서 저장해둔 현재 핸들로 전환 후 원하는 코드를 실행 하면 됩니다.