2023.11.29 - [분류 전체보기] - 인터파크 매크로 만들기. [1. 환경 구축]
환경 구축이 안된 사람은 이전 포스팅을 참고해주세요.
개발 툴을 엽시다.
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]
'그냥 끄적끄적' 카테고리의 다른 글
인터파크 매크로 만들기 [4. 좌석 선점하기 - 마무리] (4) | 2023.12.01 |
---|---|
인터파크 매크로 만들기 [4. 좌석 선점하기 - 1] (1) | 2023.12.01 |
인터파크 매크로 만들기 [3. 공연 스케쥴 선택하기 - 2] (2) | 2023.11.30 |
인터파크 매크로 만들기 [3. 공연 스케쥴 선택하기 - 1] (2) | 2023.11.30 |
인터파크 매크로 만들기. [1. 환경 구축] (2) | 2023.11.29 |