안규 공부방

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()  # 브라우저 종료
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.