[Selenium] Selenium 을 이용하여 복권 구매 자동화 만들어보기 #2
오늘은 이전 글에 이어서 팝업 닫기를 해보려합니다. 이 기능을 만들 때는 상황에 따라서 여러 방법이 가능합니다.
1. 메인 URL 을 가지고 메인 페이지만 남기기
2. 팝업 URL 을 가지고 메인 페이지만 남기기
위 1, 2 번 뿐만 아니라 더 많은 접근 방법이 가능하지만 이번 글에서는 1 번에 해당하는 방식을 사용해보려 합니다.
동행복권 홈페이지 들어가보면 메인페이지와 팝업 창이 나타납니다. 이 팝업은 일시적이겠지만 꼭 팝업을 다뤄야하기 때문에 바로 다루어 보려고합니다. 설명절 관련 팝업이기 때문에 대부분의 경우는 팝업이 없을 것이라고 생각이 듭니다. 그런 경우는 어렵지 않으니 가볍게 아래 코드를 보고 넘어가도 될 것 같습니다.
1. 메인 페이지와 팝업 페이지의 핸들러 확인하기
핸들러라고 하면 각 페이지별로 고유한 ID 를 말한다고 볼 수 있습니다. 페이지별 ID 를 가지고 화면 전환 등을 할 수 있습니다. 설명이 와닿지 않을 수 있지만 오늘 예제와 나중에 다룰 부분에 다루기 때문에 금방 개념을 알 수 있을 것입니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
def create_driver():
return webdriver.Chrome(service=Service('./driver/chromedriver_mac64_m1_97'))
driver = create_driver()
driver.get('https://dhlottery.co.kr/common.do?method=main')
def get_main_handler():
for window_handle in driver.window_handles:
driver.switch_to.window(window_handle)
print(f'현재 핸들러 name : {driver.current_window_handle}')
print(f'현재 url : {driver.current_url}')
print('')
위 코드를 실행시키면 아래와 같이 출력이 됩니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
def create_driver():
return webdriver.Chrome(service=Service('./driver/chromedriver_mac64_m1_97'))
driver = create_driver()
driver.get('https://dhlottery.co.kr/common.do?method=main')
def get_main_handle(main_url):
for window_handle in driver.window_handles:
driver.switch_to.window(window_handle)
print(f'현재 핸들러 name : {driver.current_window_handle}')
print(f'현재 url : {driver.current_url}')
print('')
if main_url in driver.current_url:
return window_handle
raise '메인 핸들러 찾지 못함'
def close_windows_if_not_main_url(main_url):
main_handle = get_main_handle(main_url)
for window_handle in driver.window_handles:
if main_handle != window_handle:
driver.switch_to.window(window_handle)
driver.close()
driver.switch_to.window(main_handle)
close_windows_if_not_main_url('common.do?method=main')
close_windows_if_not_main_url 에 main_url 을 넣고 해당 url 이 아닌 페이지는 다 닫히도록 하였다.
오늘은 간략하게 팝업 컨트롤을 보았습니다. 메소드를 분리하고 파일을 분리해야 맞지만 더욱 간편한 이해를 돕기 위해 하나의 파일 안에서 작성하고 있습니다. 제가 예제로 적는 코드는 실무에서 쓰기 좋은 코드라기 보다는 이해가 편한 코드라고 봐주시면 좋을 것 같습니다.
댓글
댓글 쓰기