포스트

셀레니움 모달창 또는 팝업창 처리방법

셀레니움으로 로그인을 자동화하는 프로그램을 만들어놨는데

특정 사이트에서 모달창이 떠서 로그인이 안되는 문제가 발생했다

정확히는 로그인 버튼 위에 모달창이 떠서

driver.find_element(By.XPATH, '{로그인 버튼 xpath}').click()를 이용해

로그인 버튼의 xpath을 누를 수 없는 상황이 발생했다

1. 경고(Alert)과 팝업(Popup), 모달(Modal)창 차이


셀레니움은 경고와 모달창, 팝업창 처리가 각각 다르다

경고(Alert)

alert

  • 즉각적인 처리가 필요한 창
  • 사용자가 내용을 확인할 때 까지 화면이 잠겨 원하는 작업을 못하게 함
  • 보통 컨테이너 내부의 버튼을 클릭함으로써 수행됨

팝업(Popup)

popup

  • 즉시 처리할 필요는 없는 창
  • 사용자가 메시지를 더이상 보고싶지 않다면 메시지를 처리해야함
  • 보통 새로운 브라우저 창으로 열린다

모달(Modal)

modal

  • 특정 작업을 완료하기 위한 창
  • 전체 화면에 모든 정보를 표시할 필요 없이 간단히 작업 수행 가능
  • 메세지는 잠겨있지 않으며, 컨테이너를 무시하려면 클릭해서 벗어날 수 있음
  • 웹 페이지 내부에서 띄워지므로 새로운 브라우저가 열리지 않음

2. 팝업창 끄기


1
2
3
4
5
6
7
8
9
main = driver.windows_handles
print(main)

for i in main:
        if i != main[0] :
            driver.switch_to.window(i) # 포커스를 팝업창으로 이동한다
            driver.close() # 팝업창 종료

driver.switch_to.window(main[0]) # 다시 메인 윈도우로 이동
  • 현재 떠있는 윈도우창들의 개수를 체크
  • 0번은 메인 윈도우이므로, 이를 제외한 윈도우들을 모두 종료하는 알고리즘

3. 모달창 끄기


대부분은 위의 팝업창으로 처리할 수 있지만,

가끔 모달창으로 위의 driver.windows_handles에 걸리지 않는 모달창이 있다

이를 처리하기 위해 찾은 두가지 방법이 있는데

  1. 모달창의 확인, 취소버튼의 xpath를 찾아 click 처리하기
    • 이 방법은 새로운 모달창이 웹페이지에 추가될 때 마다,
      개발자가 직접 모달창의 버튼의 원소를 찾고, 이를 처리해줘야하는 번거로움이 있다
  2. 무시하고 로그인 확인 버튼 누르기
    • 모달창에 가려져서 클릭이 안되는 경우라면, 클릭 대신 다른 기능을 이용해 로그인을 시도한다
    • 다른페이지로 이동한다면 상관없지만, 대신 모달창이 계속 떠있으므로 이를 처리해야 하는경우라면 문제가 됨

1번의 xpath를 찾아 click() 함수를 호출하는 방법은 많이들 쓰는 방법이므로 패스

2번으로 시도해보면

1
2
3
from selenium.webdriver.common.keys import Keys

driver.find_element(By.XPATH, '{로그인 버튼의 xpath}').send_keys(Keys.ENTER)

로 ENTER키를 보내주면 된다

참조

What’s the difference between a Modal, Popup, Popover and Lightbox?

[파이썬 셀리니움 기초]팝업창 닫는 방법

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.