SW개발/python

[python] selenium 활용한 웹사이트 동작제어 실행

코대장 2021. 6. 21. 14:59
반응형

selenium 활용한 웹사이트 동작제어 실행

서론

지난 포스팅에서는 셀레니움을 활용하여 세종도서관 자동로그인을 구현했습니다.

이번에는 로그인 이후 사용자가 직접 클릭을 하는 것과 같이 웹사이트 동작 제어를 해 보겠습니다.

바로 사전로그인 동작을 말이죠!

 

본론

우선, 지난 포스팅 복습으로 코드를 다시 올려드립니다.

오늘 진행할 부분은 "2. 사전예약 자동제어" 부분에 코드를 추가할 꺼에요.

import getpass
from selenium import webdriver

'''
국립세종도서관 자동로그인  
'''

options = webdriver.ChromeOptions()

# headless 옵션 설정 : 개발환경이 리눅스라면 아래 두가지는 포함
options.add_argument('headless')
options.add_argument("no-sandbox")

# 브라우저 사이즈 : 현재 창을 열지 않는 방식으로 구현
# options.add_argument('window-size=800,600')

''' 1. 자동로그인 제어 '''
user_id = input('아이디를 입력하세요: ')
user_pw = getpass.getpass('비밀번호를 입력하세요: ')

# 드라이버 위치 경로 입력
driver = webdriver.Chrome()

# url을 이용하여 브라우저로 접속
driver.get('https://sejong.nl.go.kr/html/c7/c701.jsp')

# 대기시간 부여
driver.implicitly_wait(3)

driver.find_element_by_id('u_id').send_keys(user_id)
driver.find_element_by_id('pword').send_keys(user_pw)
driver.find_element_by_xpath('//*[@id="contentDrt"]/div[1]/div/form[4]/div/div/div[1]/div[2]/ul/li[4]/input').click()

# 로그인 된 화면 캡처
driver.get_screenshot_as_file('capture.png')

# 대기시간 부여
driver.implicitly_wait(5)


''' 2. 사전예약 자동제어 '''
# 여기에 코드를 추가해보겠습니다.


# 자동제어 종료
driver.quit()

프로그램 수행시간이 사전예약 가능한 시간대인지 판단하는 로직을 추가해 보도록 하겠습니다.

예약가능 시간대가 아니라면 프로그램을 종료할게요.

import sys

''' 사전예약 가능시간 : 09시~17시 '''
now = datetime.now().time()
if now < time(9,0,0) or now > time(17,0,0):
    print('자동 예약가능한 시간이 아닙니다. 프로그램을 종료합니다.')
    sys.exit()

이제 예약가능한 시간대에 코드를 정상적으로 수행했다면(아이디, 비밀번호 정상 입력),

아래와 같이 "로그인 되었습니다." 라는 팝업이 뜨게 됩니다. 

사용자(사람)이 로그인 할때는 팝업이 뜬걸 인지하고 "확인"버튼을 눌러 넘어가는데요.

셀레니움에게는 이런 동작 하나하나 명령을 내려줘야합니다.

로그인 성공 팝업 화면

''' 2.1 로그인 성공 팝업 제어 '''
while True:
    try:
        sleep(5)
        popup = driver.switch_to.alert.accept()
        if popup is None:
            break
    except Exception as e:
        raise

자, 다음으로는 사전예약 화면으로 이동 후 몇가지 동작을 수행하고 최종 예약을 실행하도록 합니다.

''' 2.2 사전예약 화면으로 이동 후 예약가능 확인 및 예약제어 실행 '''
visit_resv_url = 'https://sejong.nl.go.kr/visitResv/visitList.do?menuId=O510&upperMenuId=O500'
driver.get(visit_resv_url)
while True:
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    request = Request(visit_resv_url, headers=headers)
    
    ...
    # 코드 공개는 여기까지...

혹시 세종도서관 사전예약 관련 프로그램 코드가 필요하신 분은

아래 댓글 달아주세요!

 

감사합니다.