Python 프로그래밍 > 자동 로그인 구현하기
등록일 : 2018-07-02 16:04
조회수 : 94,332
이번 포스트는 홈페이지의 로그인 부분을 자동으로 로그인 하는 간단한 기능의 메크로를 테스트 해 보고자 합니다.
먼저 로그인 웹페이지의 아이디/패스워드를 입력받는 input 객체를 찾아야 합니다.
객체를 찾는 방법은 아래 그림처럼 로그인 객체에서 마우스 오른쪽 버튼을 눌러 검사(F12) 를 선택하게 되면 객체를 찾아갈 수 있습니다.
아래 그림처럼 아이디 입력하는 부분에 마우스 갖다 대고 오른쪽 버튼을 누르면 나오는 ‘요소 검사(Q)’를 실행해 줍니다.
웹페이지 HTML 객체를 보면 아래 처럼 되어 있습니다.
<table>
<tr>
<td><input type="Text" name="m_id" maxlength="14" size="20"></td>
<td><input type="Text" name="m_passwd" maxlength="14" size="20"></td>
</tr>
<tr>
<td colspan='2'><span class="btn_b_white01" onclick="fnc_login_regist('frm_login');">로그인 </span></td>
</tr>
</table>
아이디 : m_id
패스워드 : m_passwd
로그인버튼 클릭 : fnc_login_regist('frm_login');
위와 같이 이루어 져 있음을 알 수 있습니다.
위 3개의 객체에 값을 넣고 실행하는 방법은 아래와 같습니다.
WebDriverWait(driver, WAITTIME).until(EC.presence_of_element_located((By.XPATH, "//td/input[@name='m_id']"))).send_keys(USERID)
driver.find_element_by_xpath("//td/input[@name='m_passwd']").send_keys(PASSWORD)
driver.execute_script("JavaScript:fnc_login_regist('frm_login')")
여기까지 한 후 다시 스크립트를 실행해 보면 아이디/패스워드가 잘 입력되고 있는 걸 확인할 수 있네요.
세번째 줄에는 웹페이지 스크립트를 실행하는 명령입니다.
driver.execute_script("JavaScript:fnc_login_regist()")
XPATH
XPATH로 위에 하이라이트 되어 있는 소스의 <input ~ name=”m_id”>를 선택하려면 “//input[@name=’m_id’]” 가 됩니다. 만약 name이 id가 아니라 m_passwd 였다면 “//input[@name=’m_passwd’]”가 되겠죠.
또한 input이 아니라 <img ~ src=”a.gif”> 라면 “//img[@src=’a.gif’]”라고 하면 됩니다.
즉, // 로 시작해서 찾으려는 태그 이름을 적어주고 [] 안에 추가로 찾을 해당 태그의 속성을 적어주면 됩니다.
속성은 여러개를 넣을 수 있는데 <input name=”id”, id=”id”, class=”button”> 을 찾고 싶으면 “//input[@name=’id’][@id=’id’][@class=’button’]” 이라고 하면 됩니다.
주의할 점이 이 방법은 조건에 해당 하는 모든 객체를 찾으므로 결과가 한 개가 아닐 수도 있습니다. 아래와 같은 태그들이 있다고 합시다.
1. <input class=”button” name=”id” type=”text” />
2. <input class=”button” name=”password” type=”text” />
3. <input name=”id” type=”text” />
여기서 “//input” 을 찾으면 3개가 다 나오고,
“//input[@name=’id’]” 는 1, 3 번
“//input[@class=’button’]” 은 1, 2 번
“//input[@name=’id’][@class=’button’]” 을 해야 1번만 나오게 됩니다.
아래와 같은 예도 살펴봅시다.
1. <td><input name=”id”></td>
2. <form><input name=”id”></form>
이 경우 “//input[@name=’id’]”로 찾게 되면 1, 2번이 모두 나옵니다. 이 때 1번만 찾고 싶으면 “//td/input[@name=’id’]”와 같이 하면 됩니다. 즉 ‘/’ 는 계층구조를 나타냅니다. 이처럼 찾으려는 객체 주변의 태그들의 구조와 각 태그의 속성을 활용해 찾으면 됩니다.
위의 소스를 아래에 첨부합니다. 필요하신분은 분석후 테스트해 보시기 바랍니다.
감사합니다.
#-*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import sys
HOME_URL = "http://water.entersoft.kr/include/asp/login_water.asp"
USERID = "test"
PASSWORD = "test"
WAITTIME = 50000
SLEEPSEC = 5
def fnc_login(driver):
print("로그인 처리1")
WebDriverWait(driver, WAITTIME).until(EC.presence_of_element_located((By.XPATH, "//td/input[@name='m_id']"))).send_keys(USERID)
time.sleep(2)
driver.find_element_by_xpath("//td/input[@name='m_passwd']").send_keys(PASSWORD)
time.sleep(2)
driver.execute_script("JavaScript:fnc_login_regist('frm_login')")
if __name__ == "__main__":
driver = webdriver.Chrome('./chromedriver')
driver.set_window_size(800,800)
driver.implicitly_wait(5)
driver.get(HOME_URL)
fnc_login(driver)
CSS 객체를 찾아 버튼을 클릭하는 예제는 아래와 같습니다.
menus = driver.find_elements_by_css_selector('.btn_global') # btn_global 객체를 찾는다.
pypi = None
for m in menus:
pypi = m
pypi.click() # pypi 객체를 클릭한다.
time.sleep(5) # 5초 대기
driver.quit() # 브라우저 종료