python 공부/매크로 만들기

[파이썬 매크로 만들기] #08. Selenium으로 KTX 취소표 예매하는 매크로 만들기

피치피치어피치♥ 2021. 8. 9. 23:00

<초보코딩님 유투브로 공부하며 정리하였습니다>

 

목표

1. 코레일 홈페이지 들어가서 

2. 팝업 창 끄고 

3. 예약 정보 입력

4. 매진인지 확인 

  4-1) 매진이면? refresh (조회하기 클릭)

  4-2) 매진 아니면 예매버튼 클릭

 

매크로 만들기

0. selenium에서 webdriver 모듈 들고 와서,

1. chrome driver 켜기

from selenium import webdriver
driver = webdriver.Chrome('D:\chromeDriver\chromedriver.exe')

2. 코레일 홈페이지 url 가져와서, 입력

url = "https://www.letskorail.com/ebizprd/prdMain.do"
driver.get(url)

3. 팝업창 끄기

  • 창 이동은 switch_to를 사용
  • 현재 어떤 창들이 켜져있는지 확인하기 위해
    driver.window_handles

    • 첫 요소가 메인창, 두번째 요소가 팝업창임 
    • 리스트 형태로 되어있기 때문에, index를 사용해서 두번째 요소에 접근할 수 있음
       
    • 두번째 요소에 접근해서 close 하고, 다시 메인 창에 제어권 넘겨주기 
      #close pop-up window
      driver.switch_to.window(driver.window_handles[1]) 
      driver.close()
          
      #select main-window
      driver.switch_to.window(driver.window_handles[0])​

 4. 매진 표 찾기

2021년 8월 13일 토요일 오후 7시(19시)에

서울에서 강릉으로 가는 특실 예매할 예정

 

예매표 HTML 코드 

<div class="tk_box">
<fieldset class="box01">
<legend>승차권 예매하기</legend>
<ul class="cont_lin">
<li><label for="txtGoStart">출발역</label>
<input type="text" id="txtGoStart" name="txtGoStart" class="txt120" value="서울" title="출발역" autocomplete="off" style="ime-mode:active">
<a href="#" onclick="return btnPopWin(1,'txtGoStart');" title="출발역 조회팝업이 뜹니다."><img src="/images/btn_sch_r.gif;jsessionid=a6E07VNPDNnYAgsDYtkxPTQRL1bvoZraXXwhoGdMwfpLgEjWpz1rvVv4PrDGwca6" alt="검색" class="btn_sch_r"></a>
</li>
<li><label for="txtGoEnd">도착역</label>
<input type="text" id="txtGoEnd" name="txtGoEnd" class="txt120" value="부산" title="도착역" autocomplete="off" style="ime-mode:active">
<a href="#" onclick="return btnPopWin(1,'txtGoEnd');" title="도착역 조회팝업이 뜹니다."><img src="/images/btn_sch_r.gif;jsessionid=a6E07VNPDNnYAgsDYtkxPTQRL1bvoZraXXwhoGdMwfpLgEjWpz1rvVv4PrDGwca6" alt="검색" class="btn_sch_r"></a></li>
</ul>
<ul>
<li><label for="selGoStartDay">출발일</label>
<input type="text" id="selGoStartDay" name="start" class="txt120" value="2021.8.9" title="출발일" readonly="readonly">
<a href="#" onclick="return btnPopWin(2,'main', 'N');" title="달력 팝업창이 뜹니다."><img src="/images/btn_calendar.gif;jsessionid=a6E07VNPDNnYAgsDYtkxPTQRL1bvoZraXXwhoGdMwfpLgEjWpz1rvVv4PrDGwca6" alt="달력" class="btn_sch_r"></a>
</li>
<li><label for="time">시간</label>
<select id="time" class="select" name="selGoHour" title="출발일시:시">

<option value="00">0 (오전00)</option>

<option value="01">1 (오전01)</option>

<option value="02">2 (오전02)</option>

<option value="03">3 (오전03)</option>

<option value="04">4 (오전04)</option>

<option value="05">5 (오전05)</option>

<option value="06">6 (오전06)</option>

<option value="07">7 (오전07)</option>

<option value="08">8 (오전08)</option>

<option value="09">9 (오전09)</option>

<option value="10">10 (오전10)</option>

<option value="11">11 (오전11)</option>

<option value="12">12 (오후00)</option>

<option value="13">13 (오후01)</option>

<option value="14">14 (오후02)</option>

<option value="15">15 (오후03)</option>

<option value="16">16 (오후04)</option>

<option value="17">17 (오후05)</option>

<option value="18">18 (오후06)</option>

<option value="19">19 (오후07)</option>

<option value="20">20 (오후08)</option>

<option value="21">21 (오후09)</option>

<option selected="selected" value="22">22 (오후10)</option>

<option value="23">23 (오후11)</option>

</select>시<input type="hidden" name="txtGoHour">
<input type="hidden" name="selGoYear" value="2021">
<input type="hidden" name="selGoMonth" value="08">
<input type="hidden" name="selGoDay" value="09">
<input type="hidden" name="txtGoYoil" value="월">
</li>
<li><label for="people_num">인원</label>
<select id="people_num" name="txtPsgFlg_1" title="예약인원 : 어른" class="selt147">
<option selected="selected" value="0">어른 0명</option>

<option selected="selected" value="1">어른 1명</option>

<option value="2">어른 2명</option>

<option value="3">어른 3명</option>

<option value="4">어른 4명</option>

<option value="5">어른 5명</option>

<option value="6">어른 6명</option>

<option value="7">어른 7명</option>

<option value="8">어른 8명</option>

<option value="9">어른 9명</option>

</select>
</li>
</ul>
<p class="btn_res"><a href="javascript:inqSchedule()"><img src="/images/btn_reserve.gif;jsessionid=a6E07VNPDNnYAgsDYtkxPTQRL1bvoZraXXwhoGdMwfpLgEjWpz1rvVv4PrDGwca6" alt="승차권예매" border="0"></a></p>
</fieldset>
</div>

 

승차권 예매하는 매크로

url = "https://www.letskorail.com/ebizprd/prdMain.do"
driver.get(url)
time.sleep(3)

#close pop-up window
#for i in range(0,1) :
driver.switch_to.window(driver.window_handles[1]) 
driver.close()
time.sleep(1)
    
#select main-window
driver.switch_to.window(driver.window_handles[0])
time.sleep(1)

xpath = '//input[@id="txtGoEnd"]'
driver.find_element_by_xpath(xpath).clear()
driver.find_element_by_xpath(xpath).send_keys("강릉\n")
time.sleep(1)

xpath1 = '//img[@alt="달력"]'
driver.find_element_by_xpath(xpath1).click()
time.sleep(1)

#move to pop-up
driver.switch_to.window(driver.window_handles[1])
time.sleep(1)

xpath2 = '//span[@id="d20210813"]'
driver.find_element_by_xpath(xpath2).click()
time.sleep(1)

#move to main-window again
driver.switch_to.window(driver.window_handles[0])
time.sleep(1)

xpath3 = '//select[@id="time"]'
driver.find_element_by_xpath(xpath3).click()
driver.find_element_by_xpath(xpath3).send_keys("19")
time.sleep(1) 

xpath4 = '//img[@alt="승차권예매"]'
driver.find_element_by_xpath(xpath4).click()
time.sleep(1)

while True :
    if select_btn == "예약하기" :
        driver.find_element_by_xpath(xpath6).click()
        break
    else : 
        print(select_btn)
        time.sleep(0.5)
        driver.refresh()