포스트

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

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

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

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

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

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 라이센스를 따릅니다.