매크로 개발 포스팅에 앞서,
매크로 개발 자체는 불법은 아닙니다만, 이를 이용한 암표 거래는 불법입니다.
그리고, 이 매크로는 파이썬을 처음 써보는 필자가 만든 것이므로 안될 겁니다.
[Python] 인터파크 티켓팅 기본 매크로 개발 - 1 (브라우저열기)
[Python] 인터파크 티켓팅 기본 매크로 개발 - 2 (로그인하기)
[Python] 인터파크 티켓팅 기본 매크로 개발 - 3 (예매페이지 이동)
예매페이지 이동 마지막에 예매하기 버튼 클릭을 예매창을 띄웠으니,
이제 날짜와 회차 선택을 해야함.
예매창이 로딩이 된 후 새로 열린 팝업창을 제어하기 위해 driver를 새창으로 전환 해줘야 함.
go_button = driver.find_element(By.CSS_SELECTOR, 'a.sideBtn.is-primary').click()
time.sleep(0.5) # 예매창 로딩 대기
driver.switch_to.window(driver.window_handles[1]) # 예매창으로 위치 이동
날짜 선택 이전에 체크했던 부분은,
필자와 필자의 지인들은 연뮤덕이기에 당일예매보다는 미래의 티켓팅을 주로 하는 편인지라 당일예매 팝업이 없다는 전제로 개발을 진행하려 했지만 뭔가 찝찝해서 일단 당일 예매팝업에 대한 예외처리를 해뒀음.
나중에 티켓팅 개망하면 슬프니까.
시작은 예매창내에서 필요한 구문 import 먼저!
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
import re
로그인을 후 예매페이지가 열리고, 예매창이 뜨는 경우는 time으로 제어를 했다면,
예매창에서는 WebDriverWait를 활용할 예정임.
alert 이지만 예매안내 팝업과 비슷한 방법으로 예외처리를 함.
try:
# 팝업창 열릴 때까지 대기
wait = WebDriverWait(driver, 100)
wait.until(EC.alert_is_present())
alert = Alert(driver)
# 팝업창 Yes 클릭
alert.accept()
except Exception as e:
print("no alert", e)
그렇다면, 이제 예매창이 열렸으니 날짜를 선택해야함.
아래 사진과 같이 당일 예매가 아니라면, 예매하기 버튼을 눌런 생성 된 예매창은 바로 좌석선택 화면으로 넘어가게 됨.
그래서 필자는 해당 화면에서 날짜와 회차를 선택했음.
예매창에서 날짜, 회차, 좌석을 선택하기 위해서는 각 element를 감싸고 있는 iframe으로 driver 전환이 필요함.
# iframe 로딩 될 때까지 대기
wait = WebDriverWait(driver, 100)
wait.until(EC.presence_of_element_located((By.XPATH, '//iframe[@id="ifrmSeat"]')))
# 관람일자&회차를 구성하고 있는 iframe으로 전환
iframes = driver.find_element(By.XPATH, '//iframe[@id="ifrmSeat"]')
driver.switch_to.frame(iframes)

물론 필자도, 날짜 선택화면에서 해보고 싶었음.
하지만 당일예매는 팝업이 뜨고, 미래의 날짜 티켓팅을 전부 좌석선택 화면으로 로딩이 되니 여기서 할 수 밖에....
좌석선택 화면에서 날짜 선택은 select로 되어 있는 '일자' 와 '시간'을 찾아서 선택 할 계획임.
예매팝업창에서 기존의 개발자 도구처럼 F12를 누르면 확인 할 수 없음. 예매 팝업창에서는 Ctrl + Shift + I 를 눌러야 개발자도구창이 열림.
관람일자를 선택 할 수 있는 부분의 element 구성을 보면
select 문으로 되어 있고, option의 value 값이 년월일로 되어 있는 것을 볼 수 있음.
value가 날짜 형식으로 되어 있어 원하는 날짜를 value에 넣고 select.
# 관람일자 select가 활성화 될 때까지 대기
wait = WebDriverWait(driver, 100)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='PlayDate']")))
# select로 구성 된 element 찾기
select_element = driver.find_element(By.XPATH, "//*[@id='PlayDate']")
select_date = Select(select_element)
# option의 value가 날짜 형식이기 때문에 원하는 날짜를 value로 넣음
select_date.select_by_value("20250131")

반면 회차는 option의 value가 무슨 의미 인지 알 수 없기 때문에 index로 원하는 회차 select.
# 관람회차 select 활성화 될 때까지 대기
wait = WebDriverWait(driver, 100)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='PlaySeq']")))
# select로 구성 된 element 찾기
select_time = Select(driver.find_element(By.XPATH, "//*[@id='PlaySeq']"))
# 회차는 value 값이 정의 된 값이 아니라 index로 설정
select_time.select_by_index("1")

여기까지 문제 없이 진행이 됐다면,
예매창 상단의 관람일자와 시간이 내가 원하는 날짜와 회차로 쉭쉭 변경이 되어야함.
날짜와 회차까지 선택했으니,
좌석선택은 다음 포스팅에서! 끝!
'개발 > Python' 카테고리의 다른 글
| [Python] 인터파크 티켓팅 기본 매크로 개발 - 5 (좌석 선택) (0) | 2025.01.16 |
|---|---|
| [Python] 인터파크 티켓팅 기본 매크로 개발 - 3 (예매페이지 이동) (0) | 2025.01.14 |
| [Python] 인터파크 티켓팅 기본 매크로 개발 - 2 (로그인하기) (0) | 2025.01.10 |
| [Python] 파이썬 설치 (0) | 2025.01.09 |