본문 바로가기
그냥 끄적끄적

인터파크 매크로 만들기. [2. 로그인]

by 강성주의 알고리즘 2023. 11. 29.

2023.11.29 - [분류 전체보기] - 인터파크 매크로 만들기. [1. 환경 구축]

 

인터파크 매크로 만들기. [1. 환경 구축]

2023.11.29 - [분류 전체보기] - 매크로 만들기 이전에 포스팅한 글은 사람의 행동을 반복하는 단순한 매크로를 만들었다면, 이번에 포스팅할 글은 "셀레니움" 라이브러리를 사용하여 페이지의 요소

seongjuk.tistory.com

환경 구축이 안된 사람은 이전 포스팅을 참고해주세요.

개발 툴을 엽시다. 

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

맨 위에 이와 같이, 사용할 라이브러리를 import 해줘야 합니다. 

selenium 버전업이 되면서 이전 환경 구축 때 받았던 크롬드라이버의 실행파일의 경로를 Service() 함수에 넣어주어야 합니다. 꼭 압축을 풀고 실행파일 경로를 넣어주세요. 아래는 제 파일 경로 예시입니다.

service = Service('C:/Users/newb/chromedriver.exe')
service.start()

driver = webdriver.Remote(service.service_url)

그럼 일단 매크로 구동을 위해 인터파크에 로그인을 해야 합니다. 

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service('C:/Users/seong/chromedriver.exe')
service.start()

driver = webdriver.Remote(service.service_url)

login_url = "https://ticket.interpark.com/Gate/TPLogin.asp"
driver.get(login_url)

time.sleep(3)
driver.quit()

이 코드를 실행하면 아래 화면과 같이 "자동화된 테스트 소프트웨어에 의해 제어되고 있습니다"와 함께 인터파크 티켓의 로그인 화면이 뜨고 3초 후에 닫힙니다. 실행시켜 보세요.

이 화면이 나온다면 개발환경이 잘 구축되었고 크롬 드라이버 경로가 아주 잘 입력되었음을 의미합니다. 

그럼 이제 아이디와 비밀번호를 입력해서 로그인을 해야 합니다. 셀레니움은 webdriver의 get 함수에 매개변수로 URL을 입력하면 관련 HTML 요소들을 받아올 수 있습니다. 저 화면이 켜졌다는 얘기는 driver 변수에 이러한 요소들이 저장되어 있음을 의미합니다.

여기서 우리가 필요한 정보는 아이디와 비밀번호를 입력할 수 있는 텍스트 창과, 로그인 버튼입니다.

우리는 앞으로 원하는 정보는 F12를 눌러 개발자 도구에 들어가 하나씩 찾아볼 것입니다. 아래는 아이디를 입력하는 input이라는 요소에 대해 찾은 값이 됩니다.

<input id="userId" name="userId" type="text" class="iInput" placeholder="아이디" aria-label="아이디" value="" tabindex="1" maxlength="100" onkeyup="IPK_MEMBER.event.remove_blank(this)">

selenium은 find_element의 함수를 제공하여 원하는 요소(element)의 값을 가져오거나, 값을 입력하거나, 버튼과 같은 경우 클릭을 할 수 있게 해 줍니다.

자주 쓰는 본 문법은 아래의 4가지이며, 개발자도구에서 원하는 element에 우클릭을 하면 해당 양식을 받아올 수 있습니다. 만약 저 아이디 입력하는 input 요소에 접근하려면 아래와 같이 작성하면 될 것입니다.

driver.find_element(By.CSS_SELECTOR, "찾을 값) driver.find_element(By.CSS_SELECTOR, "#userId")
driver.find_element(By.CLASS_NAME , "찾을 값) driver.find_element(By.CLASS_NAME, "iInput")
driver.find_element(By.ID, "찾을 값) driver.find_element(By.ID, "userId")
driver.find_element(By.XPATH, "찾을 값) driver.find_element(By.XPATH, '//*[@id="userId"]')

위 코드를 기반으로 아이디를 입력하는 창에 "test id"를 입력해 보도록 하겠습니다. input 요소에 값을 넣는 방법은 send_keys("내용")의 코드를 넣으면 됩니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service('C:/Users/seong/chromedriver.exe')
service.start()

driver = webdriver.Remote(service.service_url)

login_url = "https://ticket.interpark.com/Gate/TPLogin.asp"
driver.get(login_url)

id_input = driver.find_element(By.CSS_SELECTOR, "#userId")
# id_input = driver.find_element(By.CLASS_NAME, "iInput")
# id_input = driver.find_element(By.ID, "userId")
# id_input = driver.find_element(By.XPATH, '//*[@id="userId"]')

id_input.send_keys("test id")

time.sleep(3)
driver.quit()

 

어 분명 코드를 잘 넣고 실행을 했는데, 이런 에러가 뜹니다.

HTML 에는 Iframe이라는 개념이 있는데, 우리가 필요한 정보들이 이 Iframe 위에 존재합니다. Iframe은 전체 Frame과는 별개의 것이기 때문에, 전체 Frame에서 찾는 위의 코드를 실행하면 당연히 찾을 수 없다고 뜹니다. (에러가 나야 정상인 거예요!)

우리가 원하는 정보를 가져오기 위해 다음 두 줄의 코드를 추가하여 driver를 Iframe으로 교체를 해줘야 합니다. 

iframes = driver.find_elements(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframes[0])

다시 아래 코드를 실행해 보면!

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service('C:/Users/seong/chromedriver.exe')
service.start()

driver = webdriver.Remote(service.service_url)

login_url = "https://ticket.interpark.com/Gate/TPLogin.asp"
driver.get(login_url)

iframes = driver.find_elements(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframes[0])

id_input = driver.find_element(By.CSS_SELECTOR, "#userId")
# id_input = driver.find_element(By.CLASS_NAME, "iInput")
# id_input = driver.find_element(By.ID, "userId")
# id_input = driver.find_element(By.XPATH, '//*[@id="userId"]')

id_input.send_keys("test id")

time.sleep(3)
driver.quit()

 

아주 잘 입력이 된 것을 볼 수 있습니다!

동일하게 비밀번호를 입력하는 요소와 로그인 버튼 요소를 받아와서 클릭해 봅시다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

service = Service('C:/Users/seong/chromedriver.exe')
service.start()

driver = webdriver.Remote(service.service_url)

login_url = "https://ticket.interpark.com/Gate/TPLogin.asp"
driver.get(login_url)

iframes = driver.find_elements(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframes[0])

time.sleep(0.2)

id_input = driver.find_element(By.CSS_SELECTOR, "#userId")
pw_input = driver.find_element(By.CSS_SELECTOR, "#userPwd")
id_input.send_keys("test_id")
time.sleep(1)
pw_input.send_keys("test_pw")
button = driver.find_element(By.CSS_SELECTOR, "#btn_login")
button.click()


time.sleep(3)
driver.quit()

실행 영상

다음 포스팅에서는 원하는 공연의 원하는 날짜, 시간대를 선택하는 방법에 대하여 포스팅하도록 하겠습니다.

2023.11.30 - [분류 전체보기] - 인터파크 매크로 [3. 공연 스케쥴 선택하기 - 1]

 

인터파크 매크로 만들기 [3. 공연 스케쥴 선택하기 - 1]

2023.11.29 - [분류 전체보기] - 인터파크 매크로 만들기. [1. 환경 구축] 2023.11.29 - [분류 전체보기] - 인터파크 매크로 만들기. [2. 로그인] 앞 글을 보고오셔야 이해가 잘 됩니다! 이번 포스팅에서는

seongjuk.tistory.com

 

반응형