셀레니움 모달창 또는 팝업창 처리방법
셀레니움으로 로그인을 자동화하는 프로그램을 만들어놨는데
특정 사이트에서 모달창이 떠서 로그인이 안되는 문제가 발생했다
정확히는 로그인 버튼 위에 모달창이 떠서
driver.find_element(By.XPATH, '{로그인 버튼 xpath}').click()
를 이용해
로그인 버튼의 xpath을 누를 수 없는 상황이 발생했다
1. 경고(Alert)과 팝업(Popup), 모달(Modal)창 차이
셀레니움은 경고와 모달창, 팝업창 처리가 각각 다르다
경고(Alert)
- 즉각적인 처리가 필요한 창
- 사용자가 내용을 확인할 때 까지 화면이 잠겨 원하는 작업을 못하게 함
- 보통 컨테이너 내부의 버튼을 클릭함으로써 수행됨
팝업(Popup)
- 즉시 처리할 필요는 없는 창
- 사용자가 메시지를 더이상 보고싶지 않다면 메시지를 처리해야함
- 보통 새로운 브라우저 창으로 열린다
모달(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
에 걸리지 않는 모달창이 있다
이를 처리하기 위해 찾은 두가지 방법이 있는데
- 모달창의 확인, 취소버튼의 xpath를 찾아 click 처리하기
- 이 방법은 새로운 모달창이 웹페이지에 추가될 때 마다,
개발자가 직접 모달창의 버튼의 원소를 찾고, 이를 처리해줘야하는 번거로움이 있다
- 이 방법은 새로운 모달창이 웹페이지에 추가될 때 마다,
- 무시하고 로그인 확인 버튼 누르기
- 모달창에 가려져서 클릭이 안되는 경우라면, 클릭 대신 다른 기능을 이용해 로그인을 시도한다
- 다른페이지로 이동한다면 상관없지만, 대신 모달창이 계속 떠있으므로 이를 처리해야 하는경우라면 문제가 됨
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 라이센스를 따릅니다.